Javascript 为什么我们可以先修复构造函数属性,然后重置原型?
我们重置原型以实现继承是正常的。然后我们修复构造函数属性。但是为什么我们可以先修复构造函数属性,然后重置原型呢 方式1: 方式2: 当我Javascript 为什么我们可以先修复构造函数属性,然后重置原型?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我们重置原型以实现继承是正常的。然后我们修复构造函数属性。但是为什么我们可以先修复构造函数属性,然后重置原型呢 方式1: 方式2: 当我console.log(o1.constructor)时,我发现way1和way2都可以更改o1.cobstructor。我可以理解way2,因为它在重置原型后修复了构造函数(正常)。但是路2呢?我无法理解way2仍然按照o1.constructor=subType和subType.prototype=o1的顺序工作是错误的 附言: 重置原型如下所示: 子类型。
console.log(o1.constructor)
时,我发现way1和way2都可以更改o1.cobstructor。我可以理解way2,因为它在重置原型后修复了构造函数(正常)。但是路2呢?我无法理解way2仍然按照o1.constructor=subType
和subType.prototype=o1的顺序工作代码>是错误的
附言:
重置原型如下所示:
子类型。原型=超级类型
因为它改变了什么子类型。原型指向,我们需要修复构造函数
修复构造函数类似于:
子类型。prototype.constructor=子类型
这使得成为子类型。prototype.constructor
再次指向子类型。在最后一段中,您说“修复构造函数”的语句是subType.prototype.constructor=subType代码>,但这不是代码示例中的内容。在代码示例中,它是o1.constructor=subType
。如果是前者,那么命令就很重要,只有方法2起作用
相反,它使用o1.constructor=subType
。顺序无关紧要,因为语句subType.prototype=o1不会修改o1
所以它对o1.constructor=subType
的功能没有任何影响
这三个版本都有效:
函数继承原型(子类型,超类型){
var o1=Object.create(superType.prototype);
subType.prototype=o1;
o1.constructor=子类型;
}
函数继承原型(子类型,超类型){
var o1=Object.create(superType.prototype);
o1.constructor=子类型;
subType.prototype=o1;
}
函数继承原型(子类型,超类型){
var o1=Object.create(superType.prototype);
subType.prototype=o1;
subType.prototype.constructor=子类型;
}
但是这个没有,因为它在subType.prototype
的旧值上设置构造函数属性,而不是在o1
上:
函数继承原型(子类型,超类型){
var o1=Object.create(superType.prototype);
subType.prototype.constructor=子类型;
subType.prototype=o1;
}
我不知道你说的“重置原型”是什么意思。你能解释一下你认为那里发生了什么,以及这会如何影响构造函数
赋值吗?请看帖子底部的PS。你似乎仍然不明白“设置原型”意味着什么。它只是两个具有两个常规属性的对象,.prototype
和.constructor
。我们希望他们互相指向对方。顺序不重要,它们不会相互影响。影响o1.constructor
的是,由于对象,它继承了超类型.prototype
的属性。create
。可以理解版本1、版本3和版本4,但仍然觉得版本2很奇怪。例如,我们应该先犯错误,然后再改正,而不是先改正错误,然后再犯错。@Chor你想得太多了。与其认为这是一个需要纠正的错误,不如想想在一个简化的案例中发生了什么。版本1是constobj={};常数x=obj;obj.foo='bar';console.log(x.foo)代码>而版本2是const obj={};obj.foo='bar';常数x=obj;console.log(x.foo)
因此这里的subType.prototype=o1
类似于const x=obj
,而o1.constructor=subType
类似于obj.foo='bar'
?我明白了。谢谢你的帮助。
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;
o1.constructor = subType;
}