gpt4 book ai didi

javascript - 为什么我们可以先修复构造函数属性然后重置原型(prototype)?

转载 作者:行者123 更新时间:2023-11-29 23:05:19 27 4
gpt4 key购买 nike

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

方式一:

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,因为它在重置原型(prototype)(正常)后修复了构造函数。但是 way2 呢?我无法理解 way2 仍然有效,因为 o1.constructor = subTypesubType.prototype = o1; 的顺序是错误的。

附言:重置原型(prototype)就像:子类型。原型(prototype)=父类(super class)型因为它改变了什么子类型。原型(prototype)指向,我们需要修复构造函数

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

最佳答案

在您的最后一段中,您说“修复构造函数”语句是 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;
}

关于javascript - 为什么我们可以先修复构造函数属性然后重置原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com