在以下代码中,取自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; }
这是设计上的故障吗?谁能解释这种行为。它带来了什么好处?
答案 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