Javascript 为什么一个对象';如果构造函数';谁的原型改变了?

Javascript 为什么一个对象';如果构造函数';谁的原型改变了?,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

在下面的代码中,如果我将一个构造函数的prototype
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的答案。