标签:
可以吧ECMAScript的对象想象成散列表:一组键值对,其中值可以使数据或者函数。每个对象都是基于一个应用类型创建的,这个类型可以是原生类型,也可以是自定义的类型
数据属性 |
Configurable |
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的属性,他们的这个特性默认值为true。 |
Enumerable |
表示能否通过for-in循环返回属性。直接在对象上定义的属性,他们的这个特性默认值为true。 |
|
Writable |
表示能否修改属性的值。直接在对象上定义的属性,他们的这个特性默认值为true。 |
|
Value |
包含这个属性的数据值。读取属性值的时候,从这个位置度;写入属性的时候,把新值保存在这个位置。这个特性的默认值为undefined。 |
|
访问器属性 |
Configurable |
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。直接在对象上定义的属性,他们的这个特性默认值为true。 |
Enumerable |
表示能否通过for-in循环返回属性。直接在对象上定义的属性,他们的这个特性默认值为true。 |
|
Get |
在读取属性是调用的函数。默认值为undefined。 |
|
Get |
在写入属性是调用的函数。默认值为undefined。 |
方式 |
示例 |
介绍 |
优点 |
缺点 |
Object构造函数 |
|
|
|
使用同一个接口创建很多对象,会产生大量的重复代码。 |
对象字面量 |
|
|
|
使用同一个接口创建很多对象,会产生大量的重复代码。 |
工厂模式 |
|
|
|
没有解决对象识别的问题(即怎样知道一个对象的类型。) |
构造函数模式 |
|
|
可以将它的实例标志为一种特定的类型 |
每个方法都要在每个实例上重新创建一遍,不同实例上的同名函数不相等。 |
原型模式 |
|
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。同事从Object继承方法。当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性)Prototype ,指向构造函数的原型对象。 |
可以让所有对象实例共享它所包含的属性和方法 |
|
组合使用构造函数模式和原型模式 |
|
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。支持向构造函数传递参数。 |
|
|
动态原型模式 |
|
把所有的信息都封装在构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同事使用构造函数和原型的优点。 |
|
|
寄生构造函数模式 |
|
返回的对象与构造函数或者与构造函数的原型属性之间没有关系,也就是说,构造函数返回的对象与在构造函数外部创建的对象没有什么不同。 |
|
不能依赖instanceof操作符来确定对象类型。 |
稳妥构造函数模式 |
1 funtion Person(name , age , job) 2 3 { 4 5 var o = new Object(); 6 7 8 9 //可以在这里定义私有变量和函数 10 11 12 13 //添加方法 14 15 o.sayName= function() 16 17 { 18 19 alert(name); 20 21 }; 22 23 24 25 return o; 26 27 }
|
|
适合安全执行环境。 |
对象与构造函数之间也没有关系,不能依赖instanceof操作符来确定对象类型。 |
ECMAScript只支持实现继承,不支持接口继承。实现的本质是重写原型对象,代之以一个新类型的实例。
方式 |
示例 |
介绍 |
优点 |
缺点 |
原型链 |
|
构造函数的原型可以是类型,也可以是实例。所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针指向Object.prototype,这也真是所有的自定义类型都会继承toString等默认方法的根本原因。
|
|
|
借用构造函数(伪造对象或经典继承) |
|
|
|
如果仅仅是借用构造函数,那么也将无法避免构造函数模式存在的问题——方法都在构造函数中定义,因此函数服用就无从叹气了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的。 |
组合继承(伪经典继承) |
|
使用原型链实现对原型属性和方法的继承(复用部门),而通过借用构造函数来实现对实例属性的继承(非复用部分)。 |
|
无论什么情况下,都会调用两次超类型构造函数。 |
原型式继承 |
funtion object(o) { funtion F(){} F.prototype = o; return new F(); } |
从本质上讲,object()对传入其中的对象执行了一次浅复制。 |
|
包含应用类型值的属性始终都会共享相应的值,就像使用原型模式一样 |
寄生式继承 |
|
|
|
使用寄生式继承来为对象添加函数,会由于不能做到函数服用而降低效率,这一点与构造函数模式类似。 |
寄生组合式继承 |
|
通过借用构造函数来继承属性,通过原型链的混成形式来继承防范。其背后的基本思路是:不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非就是超类型原型的一个副本而已。本质上,就是使用寄生式继承来继承超类型的原型,然后再讲结果指定给子类型的原型。 |
|
只调用一次超类型构造函数。 |
标签:
原文地址:http://www.cnblogs.com/AlphaBlog/p/5434719.html