- 闭包
- 在函数内部声明一个函数并返回
- 原函数的内部变量在外部无法访问,但对内部函数是可见的,返回一个内部函数,则对外提供了一个操作函数内部变量的接口
- 一直在内存中
1 var fn=function(){ 2 var i=0; 3 var add=function(){i++;alert(i)}; 4 return add; 5 } 6 7 res=fn(); 8 9 res(); //110 res(); //2
- 封装
为了实现数据的封装,必须使用作用域,而javascript中唯一具有作用域的是函数,于是数据封闭就通过函数来完成
- 私有属性:在构造函数中用 var 定义的, 函数外部无法访问函数内部数据,从而模拟私有
- 特权属性和方法: 用this创建, 和对象实例绑定, 可以访问私有属性和方法,(访问私有属性直接使用 属性名; 而访问特权属性,由于和实例绑定,需用 this.属性名); 只有要访问私有属性的函数才应该设计为特权方法;
- 公有属性和方法: 在prototype上的属性和方法,子类会继承所有公有成员,并且使用同一份;可以访问特权成员,但无法访问私有成员
- 公有静态成员: 在类上定义的类属性,直接用 类命.成员名 访问
1 Obj=function(name,age){ 2 //私有属性 3 var name=name; 4 5 //特权属性 方法 6 this.age=age ; 7 this.getName=function(){ return name} 8 } 9 10 //公有属性 方法11 Obj.prototype.id=1;12 Obj.prototype.getAge=function(){13 return this.age; 14 }15 16 //静态17 Obj.fn=function(){18 ....19 }
- 继承
- 对象冒充
1 function ClassA(name){ 2 this.name=name; 3 } 4 ClassA.prototype.getName=function(){ 5 return this.name; 6 } 7 8 function ClassB(name, age){ 9 // this.newMethod=ClassA;10 // this.newMethod(name);11 // delete this.newMethod;12 ClassA.call(this,name);13 14 this.age=age;15 }16 ClassB.prototype=new ClassA();17 ClassB.prototype.constructor=ClassB;18 ClassB.prototype.getAge=function(){19 return this.age;20 }
- 原型链
- call()和apply()方法