使用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()的理解了!

分类: javascript语言精粹 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录