Javascript 为什么一个对象';如果构造函数';谁的原型改变了?
在下面的代码中,如果我将一个构造函数的prototypeJavascript 为什么一个对象';如果构造函数';谁的原型改变了?,javascript,constructor,prototype,Javascript,Constructor,Prototype,在下面的代码中,如果我将一个构造函数的prototypeCat.prototype=new Pet()设置为另一个对象的prototype(Pet),那么为什么它会修改它的对象的构造函数rufus.constructor 构造函数表示创建它的函数。创建父对象时,如何修改父对象 //PET CONSTRUCTOR function Pet(name, species, hello) { this.name = name; this.species = species; thi
Cat.prototype=new Pet()
设置为另一个对象的prototype(Pet
),那么为什么它会修改它的对象的构造函数rufus.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.\uu proto.\uu proto.\uu上找到这个属性,它指向Pet
函数,并输出这个函数
这里有更详细的解释。声明函数时:
函数Pet(){/*…code..*/}
解释器根据您的声明创建新的函数对象。它的prototype
属性与函数一起创建和填充。原型
的默认值是一个具有属性构造函数
的对象,该属性设置为函数本身。在我们的例子中,到Pet
:
Pet.prototype={constructor:Pet}
此对象成为新宠物()
的.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这正是从中读取构造函数
属性的对象:
rufus.hasOwnProperty('constructor') // false;
Object.getPrototypeOf(rufus).hasOwnProperty('constructor') // false;
Object.getPrototypeOf(Object.getPrototypeOf(rufus)).hasOwnProperty('constructor') // true
这就是为什么在JavaScript中的许多继承示例中,您会看到在子对象上创建构造函数属性的原因:
Cat.prototype = Object.create(Pet.prototype); // it's better to use this instead of new Pet()
Cat.prototype.constructor = Pet;
马克西姆已经回答了。但是,如果您想获得Cat(…)
作为rufus
的构造函数,您可能需要在代码中附加另一行-
Cat.prototype.constructor=Cat
因为您已将Cat
构造函数的原型替换为new Pet()
创建的对象,rufus.constructor
现在可在rufus.获得。\uu proto\uu.prototype
并指向Pet
构造函数。@Redu,我想这是鲁弗斯。请参阅我的答案`职能人员(fname,lname){this.fname=fname;this.lname=lname;}var i=newperson(“raj”,“kalia”);i、 hasOwnProperty('constructor');//false这是否意味着函数person(fname,lname){this.fname=fname;this.lname=lname;}var i=newperson(“raj”,“kalia”);i、 hasOwnProperty('constructor');//false person.hasOwnProperty('constructor');//false
这是否意味着构造函数永远不是函数对象或常规对象的属性?除非您在那里创建它。JS为您所做的唯一一件事就是将此属性放在可从您声明的函数的.prototype
属性访问的对象上。因为这个对象后来成为新创建对象的<代码>原型/<代码>,所以这个语句返回<代码>真< /代码> ->代码>对象.GETPrimeType(i).HasObjor属性(“构造函数”)/Cuth> @ BTECK,考虑接受我的回答,如果它回答了您的问题,请稍等一下,这是GR8的答案。