【问题标题】:Why we could first fix the constructor property and then reset the prototype?为什么我们可以先修复构造函数属性然后重置原型?
【发布时间】:2019-02-25 15:48:59
【问题描述】:

重置原型实现继承是正常的。然后我们修复构造函数属性。但是为什么我们可以先修复构造函数属性然后重置原型?

方式1:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}

方式2:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype); 
    subType.prototype = o1;
    o1.constructor = subType;
}

当我console.log(o1.constructor) 时,我发现way1 和way2 都可以改变o1.cobstructor。我可以理解way2,因为它在重置原型(正常)后修复了构造函数。但是way2呢?我无法理解 way2 仍然有效,因为o1.constructor = subTypesubType.prototype = o1; 的顺序是错误的。

PS: 重置原型就像: subType. prototype= superType 因为它改变了什么子类型。原型指向,我们需要修复构造函数

修复构造函数就像: subType. prototype.constructor= subType 这使得subType. prototype.constructor 再次指向 subType。

【问题讨论】:

  • 我不确定您所说的“重置原型”是什么意思。您能否解释一下您认为那里发生了什么,以及这将如何影响constructor 分配?
  • 看帖子底部的PS
  • 您似乎仍然对“设置原型”的含义感到困惑。它只是两个具有两个普通属性的对象,.prototype.constructor。我们希望它们相互指向。顺序无关紧要,它们不会相互影响。影响o1.constructor的是它从superType.prototype继承了属性,因为Object.create

标签: javascript inheritance prototype


【解决方案1】:

在您的最后一段中,您说“修复构造函数”的语句是subType.prototype.constructor = subType;,但这不是您的代码示例中的内容。在您的代码示例中,它是o1.constructor = subType。如果是前者,那么顺序很重要,只有 way2 可以工作。

改为使用o1.constructor = subType。顺序无关紧要,因为o1 没有被subType.prototype = o1; 语句修改,所以它对o1.constructor = subType 的作用没有任何影响。

这三个版本都可以工作:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    o1.constructor = subType;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    subType.prototype.constructor = subType;
}

但这个没有,因为它将构造函数属性设置为 subType.prototype 的旧值,而不是 o1

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype.constructor = subType;
    subType.prototype = o1;
}

【讨论】:

  • 能看懂version1、version3和version4,但还是觉得version2很奇怪。例如,就像我们应该先犯错误然后改正错误,而不是先改正错误然后再犯错误。
  • @Chor 你想多了。与其将其视为需要修复的错误,不如考虑在简化的情况下发生了什么。版本 1 是 const obj = {}; const x = obj; obj.foo = 'bar'; console.log( x.foo ); 而版本 2 是 const obj = {}; obj.foo = 'bar'; const x = obj; console.log( x.foo );
  • 所以这里subType.prototype = o1; 就像const x = objo1.constructor=subType 就像obj.foo='bar' ?我想通了。谢谢你的帮助。
猜你喜欢
  • 2017-04-20
  • 2014-01-05
  • 1970-01-01
  • 2012-03-09
  • 2012-01-17
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多