JavaScript ----------------- 原型式继承
思想:借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。为了达到这个目的,看看下面的实现方式
1 function object(o){ 2 function F(){ 3 4 } 5 F.prototype=O; 6 return new F(); 7 };
在上面的代码段中主要做了哪些事情尼?
创建了一个临时的构造函数,同时把传入参数作为临时构造函数的原型,最后返回一个临时构造函数的实例;从本质上来讲,object 对传入其中的对象执行了一次浅复制;
1
//看实例:
function object(o){ 2 function F(){ 3 4 } 5 F.prototype=o; 6 return new F(); 7 }; 8 9 //在上面中 10 11 var person={ 12 name:"Nicholas", 13 friends:["Shelby","Court","Van"] 14 } 15 16 var person1 = object(person); 17 person1.name = "Greg"; 18 person1.friends.push("Rob"); 19 20 21 var person2 = object(person); 22 person2.name = "Linda"; 23 person2.friends.push("Barbie"); 24 25 alert(person.friends); // Shelby Court Van Greg Rob
对于这种继承方式必须依赖于存在一个对象作为另一个对象的基础。如果有这么一个对象的话,可以把它传递给object()函数,然后再根据具体需求对得到的对象加已修改即可。
实例从结果可以看出,person1与person2 就是person对象的副本。
ECMAScript5中通过新增Object.create() 方法规范化了原型式继承。这个方法接收两个参,当只传一个参数的时候与object()行为相同。
@param1 接收一个对象
@param2 可选 接受一个为新对象定义的额外属性的对象,类似 Object.defineProperties()方法的参数格式相同:每个属性都是通过自己的描述符定义的;已这种方式创建属性都会覆盖原型上的同名属性。
Object.create()
var person={ name:"Nicholas", friends:["Shelby","Court","Van"] } var person1 = Object.create(person,{ name:{ value:"Greg" } }); person1.name; // Greg
1 var person={ 2 name:"Nicholas", 3 friends:["Shelby","Court","Van"] 4 } 5 6 var person1 = Object.create(person,{ 7 name:{ 8 value:"Greg", 9 enumerable:false 10 } 11 }); 12 name in person1; // false 13
综合上一篇的组合继承,在没有必要创建构造函数,而指想让一个对象与另一个对象保持类似的情况下,原型式继承是完全可以胜任的。不过别忘了,包含引用类型值得属性始终都会共享相应的值,就像使用原型模式一样。