函数的prototype属性如何影响对象的构造函数属性?

时间:2014-07-12 08:01:41

标签: javascript oop

我有以下代码段

function Dad(){

  this.name="i am dad";
}

function Son(){
   this.nameOfChild="child";   
}

var sonBeforeInheritance= new Son();
alert(sonBeforeInheritance.constructor);  //outputs Son class

//inheritance done
Son.prototype= new Dad();

var sonObj= new Son();
alert(sonObj.constructor); //outputs Dad class    
alert(sonBeforeInheritance.constructor);  //outputs Son class

我的未知请用真/假和解释回答:

  1. 虽然js中的函数也是对象,但使用 new keyword prototype 对象创建的对象是唯一可以访问名为的属性的对象构造函数 sonObj.constructor和Son.prototype.constructor 有效
  2. js中的函数有一个名为 prototype 的对象,用new关键字定义的对象没有,即 sonObj 上面没有原型 sonObj.prototype是"未定义"
  3. 现在构造函数指向用于制作对象的类?如果是真的那么为什么sonObj.constructor给我爸爸课?有人可能会说Son的原型已经改变,那么 Son.prototype.constructor &#34; Son&#34; .constructor 的实例指向同一个对象?< / LI>
  4. 继承后为什么要写 Son.prototype.constructor = Son

1 个答案:

答案 0 :(得分:1)

  

虽然js中的函数也是对象,但是对象是   用新关键字和原型对象创建的是唯一的   可以访问名为constructor

的属性

没有。 js中的大多数对象都有.constructor属性,它们从原型继承。此外,由{}创建的普通对象继承Object.prototype,而.constructor的{​​{1}}将指向Object,就像数组从.constructor == Array继承Array.prototype或函数从.constructor == Function继承Function.prototype。它们不一定需要由new创建。

  js中的

函数有一个对象   调用原型,用新关键字定义的对象没有   sonObj上面没有原型,即sonObj.prototype是   &#34;未定义&#34;

真。那是how .prototype works

  

现在构造函数指向以前用过的类   做对象?

不一定。 .constructor是原型上的普通属性,因此它将由实例继承,并且初始化成为原型对象所属的函数。但.prototype.constructor都是可覆盖的。

  

如果为真,那么为什么sonObj.constructor会给我爸爸   类?

因为您已使用Son.prototype属性不是.constructor的对象覆盖了Son,但是继承了值Dad(您已对其进行了更改)成为new Dad个实例 - questionable, btw

  有人可能会说Son的原型发生了变化   Son.prototype.constructor和&#34; Son&#34; .constructor的实例指向   同一个对象?

  

为什么我要写Son.prototype.constructor = Son   继承?

修复它并让它像您最初预期的那样工作。另请参阅What is the `constructor` property really used for?