当我在MDN中阅读有关原型继承的文章时,我发现了这段代码。
function B(a, b){ }
B.prototype = Object.create(A.prototype, {});
B.prototype.constructor = B;
var b = new B();
为简单起见,我删除了函数的内部内容。一旦创建,B.prototype.constructor
就会被分配给B.为什么要这样做以及prototype.constructor在原型链中的作用是什么。我发现了这个SO问题,其中一个答案是
在分配后重置构造函数是一种很好的做法。
我想对此有一个很好的解释,原型链中对此有何影响。在MDN中,Object.prototype.constructor被解释为
返回对创建实例原型的Object函数的引用。
我试过了
function A(name) {
this.name = name
}
function B() {
this.getName = function(){
console.log('hello');
}
}
var b = new B();
此处b.constructor
为function A(name)
,b.__proto__.constructor
中还有另一个构造函数,两者都相同。这两者有什么区别。现在,当我执行以下B.prototype.constructor == B
时,b.constructor
为function B()
现在我已经从b
var c = Object.create(b)
那么这将如何影响原型链。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:2)
创建函数时,例如
function A() {}
自动接收prototype
属性,该属性是具有constructor
属性的对象,该属性是函数:
A.prototype.constructor === A;
JS内部不使用此constructor
属性,因此您可以更改它,删除它或执行您想要的操作。
但是,有些代码依赖于该属性来从其原型中获取构造函数,或者从继承自该原型的实例中获取构造函数。因此,最好不要修改它。
如果用新对象替换原型,则删除constructor
属性。所以最好重置它:
function A() {}
function B() {}
B.prototype.constructor; // B
B.prototype = Object.create(A.prototype);
B.prototype.constructor; // A
B.prototype.constructor = B;
B.prototype.constructor; // B