javascript基础一
2016-06-28 23:42
543 查看
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;> 闭包: p199 嵌套函数不会将作用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照, 一个函数内的多个闭包将共享这个函数的局部变量;
特点: 弱类型, 继承基于原型, 对象的属性名映射为任意属性名;
javascript: 核心ECMAScript, 文档对象模型DOM, 浏览器对象模型BOM;
ECMAScript: 定义语法, 关键字, 保留字, 对象.., 3/5版本;
DOM:
BOM: browser object model, 可以控制浏览器页面以外的显示;
引用了外部的.js文件, 则之间不能加代码
undefined, null 都是空的,所以==时真, undefined是undefine类型, null是object类型, 指空对象;
0/0 => NaN, 12/0 => Infinity
isNaN: 对象处理: 如果valueof不能返回数据则调用toString, 如果toString函数返回数字则是true;
object()
字面量创建{“A”: 14}
this指的是调用函数的对象
window是js下的全局对象: var a = 10; this.a ===window.a;
apply, call , call与apply只是传递参数不同其它一样:
而通过new 出来的基本类型是可以添加自定义的属性和方法, 如var s = new String(“hebinbin”); s.name=”he”;
构造函数无需返回值, 但即使有返回值也不会影响到new运行符的使用结果 (返回值无影响);
构造函数是引用类型, 两个同样的对象的实例的函数不一样 (地址不同), 这也可以认为防止一个实例的函数改变不会影响另一个实例的函数; (函数是对象, 每次实例化时生成的函数自然不会一样)
prototype添加的属性是原型属性, 方法;
实例属性与实例方法的区别就是:共享, 原型属性是所有实例对象共享的;
实例对象自动根据prototype生成指针指向共享的proto对象, (IE不支持);
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
对象冒充只能继承构造里的信息,不会继承原型里的信息;
组合继承
如例子为nodejs中继承EventEmitter类, 使用事件监听:
原型式继承
闭包运行的时候this指向的是window:
私有作用域: (var …; function(){…})();
闭包封装数据, 函数达到私有数据的效果;
私有函数, 属性
静态成员
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;> 闭包: p199 嵌套函数不会将作用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照, 一个函数内的多个闭包将共享这个函数的局部变量;
一.语言简介
基于对象与事件驱动的相对安全的客户端脚本语言;特点: 弱类型, 继承基于原型, 对象的属性名映射为任意属性名;
javascript: 核心ECMAScript, 文档对象模型DOM, 浏览器对象模型BOM;
ECMAScript: 定义语法, 关键字, 保留字, 对象.., 3/5版本;
DOM:
BOM: browser object model, 可以控制浏览器页面以外的显示;
引用了外部的.js文件, 则之间不能加代码
undefined, null 都是空的,所以==时真, undefined是undefine类型, null是object类型, 指空对象;
0/0 => NaN, 12/0 => Infinity
isNaN: 对象处理: 如果valueof不能返回数据则调用toString, 如果toString函数返回数字则是true;
二, 函数
函数没有重载功能, 调用的是最近定义的函数;三, 对象
new创建: new object()object()
字面量创建{“A”: 14}
四. function
argument.callee 在函数内部调用自身this指的是调用函数的对象
window是js下的全局对象: var a = 10; this.a ===window.a;
apply, call , call与apply只是传递参数不同其它一样:
var nb = 10; function sum(n1,n2){ return n1+n2+nb; } function use(n1,n2){ // this 指执行的对象,这里是window return sum.apply(this,[ni,n2]) // 或 return sum.apply(this,arguments) // 或 return sum.apply(this,n1,n2) } // apply, call主要用于实现函数执行域的替换 var box = { nb = 10 } sum.apply(box,1,2) // => 1 + 2 + 123
四. 基本类型
基本类型无法给自己创建新的属性和方法,但可以调用系统内置的方法;而通过new 出来的基本类型是可以添加自定义的属性和方法, 如var s = new String(“hebinbin”); s.name=”he”;
五. 面向对象
构造函数没有new object,也没有return obj, 但调用时采用了new运算后则能够在隐匿完成这些过程;构造函数无需返回值, 但即使有返回值也不会影响到new运行符的使用结果 (返回值无影响);
构造函数是引用类型, 两个同样的对象的实例的函数不一样 (地址不同), 这也可以认为防止一个实例的函数改变不会影响另一个实例的函数; (函数是对象, 每次实例化时生成的函数自然不会一样)
六. 原型
构造函数里的属性是实例属性;prototype添加的属性是原型属性, 方法;
实例属性与实例方法的区别就是:共享, 原型属性是所有实例对象共享的;
实例对象自动根据prototype生成指针指向共享的proto对象, (IE不支持);
实例对象存在constructor指针指向构造函数;
prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){ this.name = name; this.age = age; } Box.prototype = {constructor:Box} // 通过对象字面量构造的prototype如果不自己定义constructor对象指向Box的话,b1.constructor则只是object类型, 所以这里需要手动加上; Box.prototype.run = function() { return "hello" }; var b1 = new Box("a",1); alert(b1.constructor);
七. 继承
原型链继承对象冒充只能继承构造里的信息,不会继承原型里的信息;
组合继承
function Box(name){ this.name = name } Box.prototype.run = function(){ return this.name + "hello" } function Drive(name){ Box.call(this,name) } // 上面的Drive构造函数生成的对象是无法使用到Box的prototype对象里的数据, 所以需要加上下面的语句: Drive.prototype = new Box() var d = new Drive("he") alert(d.run());
如例子为nodejs中继承EventEmitter类, 使用事件监听:
var util = require('util') var events = require('events') function MyE(){ this.count = 0; events.EventEmitter.call(this); } util.inherits(MyE, events.EventEmitter); // define a method MyE.prototype.ping = function(){ var self = this; setInterval(function(){ ++self.count; console.log('ping' + self.count); self.emit('data') }, 1000); }; var ee = new MyE(); ee.on('data',function(){ ++this.count; console.log('pong' + this.count); }) ee.ping();
原型式继承
function obj(o){ function F(){} F.prototype = o return new F() }
八. 闭包与私有成员
闭包变量解除引用: b = null闭包运行的时候this指向的是window:
var user = "win"; var Box = { user:"box", run:function () { return function () { return this.user } } }; alert(Box.run()()); // win alert(Box.run().call(Box)) // box
私有作用域: (var …; function(){…})();
闭包封装数据, 函数达到私有数据的效果;
function test(){ for (var i = 0; i < 5; ++i){ ... } alert(i); } // 私有作用域: 通过自我执行函数包装 function test(){ (function(){ for (var i = 0; i < 5; ++i){ ... } })(); alert(i); // undefined }
私有函数, 属性
function test(){ var privar = "11" // 私有 function run(){ // 私有 .... } this.pubRun = function(){ // 公有 run() } };
静态成员
(function (){ var data = 0; // 静态私有变量 Box = function(value){ // 全局Box 构造函数 data = value; // 靜态 } // 共享接口 Box.prototype.getData = function(){ return data; }; Box.prototype.setData = function(v){ data = v; } })(); var b1 = new Box(10); var b2 = new Box(20); // 改变了静态值 alert(b1.getData()); // 20 b2.setData(30); alert(b1.getData()); // 30
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享