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