在以下摘自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; }
是设计上的故障。任何人都可以解释这种行为。它带来什么好处?
当您键入时rufus.constructor
,JavaScript会检查rufus
对象上是否有此类属性。它不在那里,因为您没有在这里创建它。然后它向上遍历原型链,并找到此属性,该属性rufus.__proto__.__proto__
指向Pet
函数并输出该函数。
这是更详细的说明。声明函数时:
function Pet() { /* ..code.. */ }
解释器根据您的声明创建新的函数对象。与该函数一起,将prototype
创建并填充其属性。此默认值prototype
是具有属性的对象constructor
,该属性设置为函数本身。就我们而言Pet
:
Pet.prototype = { constructor: Pet}
该对象成为的.__proto__
,new Pet()
可rufus
通过到达rufus.__proto__.__proto__
。这正是从中constructor
读取属性的对象:
rufus.hasOwnProperty('constructor') // false;
Object.getPrototypeOf(rufus).hasOwnProperty('constructor') // false;
Object.getPrototypeOf(Object.getPrototypeOf(rufus)).hasOwnProperty('constructor') // true
这就是为什么您会constructor
在许多JavaScript继承示例中看到在子对象上创建属性的原因:
Cat.prototype = Object.create(Pet.prototype); // it's better to use this instead of new Pet()
Cat.prototype.constructor = Pet;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句