原型继承Object.create()
使用Obejct.create()方法继承的原型和传统的new方法是一样的,但是又有些不同,因为create()支持第二个参数,第一个参数往往是父类的prototype,比如Obejct.create(Box.prototype);这是正常的对一个Box构造函数的原型继承。
Obejct.create本身会创建一个新的对象并继承Box.prototype原型然后返回该新建的对象,但是还有一种情况是这样的:
var Box = {
name : '666';
}
var o = Obejct.create(Box.prototype);
如果这样写,就会报错,Box实际上是一个字面量的形式,他需要这样写才能继承。
var o = Obejct.create(Box);
这种方式和原型式继承相同:
function obj(o) {
function F() {};
F.prototype = o;
return new F();
}
var box = {
name : '666';
}
var o = obj(box);
为此这里有涉及到差异化继承,由于中文化翻译比较少,没有很细致的说明,这里我就讲一下我自己的理解。
差异化继承无非就是通过Obejct.create(Box)这种方式,不断继承上一个父类的独立属性到新对象的prototype中去,Obejct.create方法直接封装成一个Obejct对象prototype原型中的一个方法,比如:
Object.prototype.clone = function(){
// 创建一个新的对象,并用 this 作为它的原型
var p = Object.create(this);
/* 并不是必须的:
// 在新对象上应用构造函数
this.constructor.apply(p, arguments);
*/
return p;
};
通过不断的使用clone来获取上一个字面量对象中的属性来作为新对象的prototype原型属性,这样不断的叠加从而产生新的个性化增长对象,而我们只需要调整父类的独立属性就能对子类发生改变,前提是没有重复的属性。
更多实际代码可以参考这个链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Differential_inheritance_in_JavaScript
那么就来讲讲第二个参数,create的第二个参数官方翻译很拗口,这里我们就可以理解新对象的独立属性,写的时候还有点麻烦,如:
var o = Object.create({}, { p: { value: 42 } });
/*
{
p: { value: 42 }
}
*/
第二个参数作为一个字面量对象存在,里面每添加一个独立属性就要如p这般写,键值对一个新字面量对象,value的值就是p的值,你可以写字符啊,数字,方法,这样就可以简单的创建一个独立属性,但是,由于省略了几个属性,导致这个p是不可以修改,不能被枚举的,相当于是一个锁死的值。
for(var i in o) {
alert(i);
}
//直接返回undefined
如果要可以读写要改成如下形式:
var o = Object.create({}, {
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});
以上就是对于Object.create()的理解了!
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据