正在加载中

最后更新于 2019年08月04日

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

  • weixiao kaixin tushetou jingkong deyi fanu liezui liuhan daku ganga bishi nanguo lihai qian yiwen numu tu yi haixiu se fadai minyan hehe henkaixin huaji biyiyan kuanghan maimeng shui xiaku penqi zhangzui pen aini ye niu laji ok chigua renshi kongbu shuai xiaoxiese touxiao huaixiao jingnu chihuai kaisang xiaoku koubi zhuangbi lianhong kanbujian shafa zhijing xiangjiao dabian yaowan redjing lazhu rizhi duocang chixigua hejiu xixi xiaopen goukun xiaobuchu shenme wusuowei guancha lajing chouyan xiaochi bie zhadanzui zhadanxiao

登录