【问题标题】:object constructor pointing to Object function after redefining prototype of self defined function重新定义自定义函数原型后指向对象函数的对象构造函数
【发布时间】:2014-07-25 10:20:48
【问题描述】:

每当我重新定义函数原型并创建它的新对象时,它的构造函数开始指向根 Object 函数而不是函数本身。让我用场景来解释一下:

var Person=function(firstName,lastName)
{
    this.firstName=firstName;
    this.lastName=lastName;
} 

Person.prototype.getFullName=function()
{
    return this.firstName+" "+this.lastName;
}
var student=new Person("Ankur","Aggarwal");
student.constructor //shows Person which is correct

之后,如果我重新定义了 Person 原型并创建了一个已更改的新对象

Person.prototype={}
var manager=new Person('John','Smith');
manager.constructor // Points to Object. Why?

另外,如果它指向的是 Object 而不是 Person,它怎么能访问 Person 属性,比如 firstName 和 lastName?

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

    给定构造函数:

    var Person=function(firstName,lastName)
    {
        this.firstName=firstName;
        this.lastName=lastName;
    } 
    

    它有一个默认的 prototype 属性,该属性是一个对象,其 constructor 属性引用了 Person 构造函数。 (默认情况下)实例通过[[Prototype]] 链继承的正是这个属性。

    当你创建一个实例时,firstNamelastName 属性是在实例上定义的,就像这样:

    var person = {firstName:..., lastName:...};
    

    因此对这些属性的访问不受构造函数原型的影响。

    当一个新的对象被分配给构造函数的原型时:

    Person.prototype = {};
    

    它从 Object.prototype(这是它的构造函数)继承了一个 constructor 属性。所以访问实例的构造函数首先查看实例,然后查看其[[Prototype]](Person.prototype),然后查看其[[Prototype]](Object.prototype)并找到对Object的引用。您可以通过以下方式解决此问题:

    Person.prototype.constructor = Person;
    

    您可以在 MDN 上找到更多信息:Inheritance and the prototype chain

    【讨论】:

      【解决方案2】:

      构造对象不会将其constructor 属性设置为构造它的函数。相反,函数的默认 prototype 使用指向该函数的 constructor 属性进行初始化,并且由该函数构造的对象从原型继承 constructor 属性。

      当您替换函数的prototype 时,替换不会自动将该函数分配给其constructor 属性。相反,新的prototype原型继承constructor,即Object.prototype。因此,由该函数创建的对象现在将从其原始原型Object.prototype 继承Objectconstructor

      【讨论】:

        猜你喜欢
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多