Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我们可以先修复构造函数属性,然后重置原型?_Javascript_Inheritance_Prototype - Fatal编程技术网

Javascript 为什么我们可以先修复构造函数属性,然后重置原型?

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的顺序工作是错误的 附言: 重置原型如下所示: 子类型。

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

方式1:

方式2:

当我
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;
}