如果构造函数的原型发生了变化,为什么对象的构造函数属性会发生变化?

时间:2016-10-12 11:52:09

标签: javascript constructor prototype

在以下代码中,取自Helephant.com,如果我将构造函数的原型Cat.prototype = new Pet()设置为另一个对象(Pet)的原型,那么为什么呢?它修改了它的对象rufus.constructor的构造函数?

constructor表示创建它的函数。如何创建父母可以修改它?

//PET CONSTRUCTOR
function Pet(name, species, hello) 
{   this.name = name;
    this.species = species;
    this.hello = hello; }

//CAT CONSTRUCTOR
function Cat(name, hello, breed, whiskerLength)
{   this.name = name;
    this.hello = hello;
    this.breed = breed;
    this.whiskerLength = whiskerLength;}

//SETTING CAT's PROTOTYPE to A NEW PET OBJECT.  
Cat.prototype = new Pet();

//CREATING A NEW CAT OBJECT
var rufus= new Cat("rufus", "miaow", "Maine Coon", 7);

//CALLING CAT OBJ's CONSTRUCTOR PROPERTY
rufus.constructor;

//OUTPUT
function Pet(name, species, hello) 
{   
this.name = name;
this.species = species;
this.hello = hello; }

这是设计上的故障吗?谁能解释这种行为。它带来了什么好处?

2 个答案:

答案 0 :(得分:2)

当您键入rufus.constructor时,JavaScript会检查rufus对象上是否存在此类属性。它不在那里,因为你没有在那里创造它。然后它向上通过原型链并在rufus.__proto__.__proto__上找到该属性,该属性指向Pet函数并输出此函数。

这里有更详细的解释。声明函数时:

function Pet() { /* ..code.. */ }

解释器从您的声明中创建新的函数对象。与函数一起,创建并填充prototype属性。此默认值prototype是具有属性constructor的对象,该对象设置为函数本身。在我们的例子中,Pet

Pet.prototype = { constructor: Pet}

此对象成为.__proto__的{​​{1}},可通过new Pet()rufus到达。这正是读取rufus.__proto__.__proto__属性的对象:

constructor

这正是您在JavaScript中继承许多遗留示例时在子对象上创建rufus.hasOwnProperty('constructor') // false; Object.getPrototypeOf(rufus).hasOwnProperty('constructor') // false; Object.getPrototypeOf(Object.getPrototypeOf(rufus)).hasOwnProperty('constructor') // true 属性的原因:

constructor

答案 1 :(得分:0)

Maxim已经回答了。但是,如果想让Cat(...)作为rufus的构造函数,您可能希望在代码后追加另一行, Cat.prototype.constructor = Cat