【问题标题】:How will the prototype chain break?原型链将如何断裂?
【发布时间】:2020-12-07 09:44:23
【问题描述】:

我正在尝试学习 JavaScript 中的继承。MDN 上的这篇文章解释了原型链的工作原理。


let f = function () {
   this.a = 1;
   this.b = 2;
}
let o = new f(); // {a: 1, b: 2}


f.prototype.b = 3;
f.prototype.c = 4; 

有评论说

// do not set the prototype f.prototype = {b:3,c:4}; this will break the prototype chain

这将如何打破链条? .我的猜测是,因为我们正在覆盖构造函数的原型对象,所以 向上链 的所有其他引用都丢失了。但是我们可以使用 Object.create(someobject) 这不会破坏链条。

【问题讨论】:

  • 我的猜测是因为我们正在覆盖构造函数的原型对象,所以所有其他向上链的引用都丢失了。不完全的。并不是说向上链参考丢失了。是您替换了当前原型,因此原型上已经存在的任何其他内容现在都丢失了。这与执行let x = {a: 1} 然后执行x = {b: 2} 相同。您将分配给x 的整个对象替换为不同的对象,因此当您执行console.log(x) 时,其上将没有a 属性。

标签: javascript ecmascript-6


【解决方案1】:
f.prototype = Object.create(someobject);

someobject 的属性和方法将在 f.protoype 对象中可用。因此,所有 f 的实例都将具有可供它们使用的方法和属性。

为什么它不会断链?

Object.create() 直接根据提供的(原型)参数构造一个对象。参数本身(可能)通过其 [[prototype]] 属性获得所有引用

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多