重定义自定义函数原型后指向Object函数的对象构造函数

时间:2014-07-25 10:20:49

标签: javascript prototype

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

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 not Person,它怎么能访问Person属性,如firstName和lastName?

enter image description here

2 个答案:

答案 0 :(得分:2)

给出构造函数:

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

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

创建实例时,会在实例上定义 firstName lastName 属性,如下所示:

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

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

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

Person.prototype = {};

它从 Object.prototype (它的构造函数)继承了构造函数属性。因此,访问实例的构造函数首先查看实例,然后查看其[[Prototype]](Person.prototype),然后查看其[[Prototype]](Object.prototype)和找到对 Object 的引用。您可以通过执行以下操作来解决此问题:

Person.prototype.constructor = Person;

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

答案 1 :(得分:2)

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

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