【问题标题】:What's the difference between childObj.prototype = Object.create(parentObj.prototype) and childObj.prototype = parentObj.prototype?childObj.prototype = Object.create(parentObj.prototype) 和 childObj.prototype = parentObj.prototype 有什么区别?
【发布时间】:2016-08-20 13:57:03
【问题描述】:

我想知道两者的区别:

childObj.prototype = Object.create(parentObj.prototype)

childObj.prototype = parentObj.prototype;

因为它们都需要在子对象中调用父构造函数才能访问构造函数属性。

我知道 Object.create 函数是如何工作的,我注意到不同之处只是因为它返回一个带有父原型的 NEW 对象。我想我不明白的是用父原型返回一个新对象的效果。

【问题讨论】:

  • 先建立一个原型链,后面可以修改child.prototype,不会影响到parent。第二个是从字面上对两者进行别名以指向相同的数据结构,并通过任一修改该单个数据结构进行修改,从而影响两者。你想要第一个,虽然通常你想要 ChildObj.prototype = new ParentObj() 而不是 Object.create
  • 虽然通常你想要ChildObj.prototype = new ParentObj() 可能不会,因为这会在将.prototype 分配给它的孩子时调用ParentObj 构造函数,而不是在创建新实例时.

标签: javascript object prototype prototype-programming


【解决方案1】:

您的第一个示例是正确的方法,因为它创建了一个以parentObj.prototype 作为其[[Prototype]] 的新对象:

childObj.prototype = Object.create(parentObj.prototype); // { __proto__: parentObj.prototype }

第二个只是将childObj.prototype 设置为与parentObj.prototype 相同的对象。这会导致一些问题:

function parentObj() {
}

parentObj.prototype.parentFn = function() { console.log('parent'); };


function childObj() {
}

childObj.prototype = parentObj.prototype;

// here we are writing onto parentObj.prototype as well!!!
childObj.prototype.childFn = function() { console.log('child'); };

var child = new childObj();

var parent = new childObj();

child.parentFn(); // 'parent'
parent.childFn(); // 'child' --- this should not happen!!!

在直接赋值对象时,我们已经写到了父.prototype

【讨论】:

    【解决方案2】:

    基本上Object.create的第一个参数是原型,第二个参数是属性描述符对象。因此,当您将 prototype 对象单独传递给 Object.create 时,将创建一个没有任何 自己的属性object 并且传递的 object 将分配给新创建的对象的__proto__

    var x = {a:10};
    var y = Object.create(x);
    console.log(y); //{__proto__:{a:10}}
    

    但是,当您将父母的原型分配给孩子的原型时,只是引用重叠了。并且对象不会发生任何结构变化。

    【讨论】:

    • @downvoter 想发表评论?这样我就可以在这里纠正我的错误理解。谢谢
    【解决方案3】:

    我能想到的一个区别是:
    假设你有

    c = new childObj()
    p = new parentObj()
    

    在这两种情况下你都会有

    c instanceof parentObj === true
    

    但在第二种情况下,你也会有

    p instanceof childObj === true
    

    在第一种情况下,您将拥有

    p instanceof childObj === false
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 2022-06-22
      • 2016-06-16
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      相关资源
      最近更新 更多