什么是prototype.constructor及其在原型链中的作用 - Javascript

时间:2015-07-14 18:09:22

标签: javascript prototype

当我在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.constructorfunction A(name)b.__proto__.constructor中还有另一个构造函数,两者都相同。这两者有什么区别。现在,当我执行以下B.prototype.constructor == B时,b.constructorfunction B()

现在我已经从b

创建了一个新对象
var c = Object.create(b)

那么这将如何影响原型链。

非常感谢任何帮助。提前谢谢。

1 个答案:

答案 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