【问题标题】:What is prototype.constructor and its role in the prototype chain - Javascript [duplicate]什么是prototype.constructor及其在原型链中的作用-Javascript [重复]
【发布时间】:2015-10-03 12:49:07
【问题描述】:

当我在MDN阅读原型继承时,我发现了这段代码sn-p。

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 问题,一个答案是

在赋值后重置构造函数是一个好习惯。

我想对此有一个很好的解释,以及在原型链中对此有何影响。在MDNObject.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)

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

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

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

    当你创建一个函数时,例如

    function A() {}
    

    它自动接收一个prototype属性,这是一个带有constructor属性的对象,它是函数:

    A.prototype.constructor === A;
    

    这个constructor属性不被JS内部使用,所以你可以改变它,删除它,或者做你想做的事。

    但是,一些代码依赖该属性从其原型或从该原型继承的实例中获取构造函数。所以最好不要修改它。

    如果您用新对象替换原型,您将删除该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
    

    【讨论】:

    • 构造函数属性仅在使用新关键字初始化时启用。
    • @MdAtiqulHaque:不确定你的意思。 .constructor 不是用new 调用初始化的,如果你没有用new 调用A,那么你显然不会创建实例。
    猜你喜欢
    • 2012-08-12
    • 2016-01-02
    • 1970-01-01
    • 2011-11-08
    • 2023-03-25
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多