鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ js原型和繼承的問題?

js原型和繼承的問題?

function Person(name,age){
  this.name = name;
  this.age = age;
}
 
Person.prototype.getAge = function(){
  return this.age;
}
Person.prototype.getName = function(){
  return this.name;
}
 
var p = new Person("Nicholas",18);
console.log(p.constructor === Person.prototype.constructor)// true 

因?yàn)?p.constructor回去找p.__proto__中的值,而 p.__proto__ 由 Person.prototype而來,所以相等

function Person(name,age){
  this.name = name;
  this.age = age;
}
 
Person.prototype = 1
 
var p = new Person("Nicholas",18);
console.log(p.constructor); //? Object() { [native code] }

為什么不是 Person.prototype.constructor的Number,而是object
而且 p.constructor === Person.prototype.constructor也返回false

回答
編輯回答
挽歌

Person.prototype 如果不是對象,就會設(shè)置 p 的原型為 Object構(gòu)造函數(shù)。

2017年4月17日 00:24
編輯回答
念舊

對于你改完的代碼我們可以一步步看,

function Person(name,age){
  this.name = name;
  this.age = age;
}

我們可以log下這個Person.prototype,發(fā)現(xiàn)是個object,里面有constructor和__proto__,前者對應(yīng)的默認(rèn)是你函數(shù)本身,后者是繼承Object得來的。
然后

Person.prototype = 1

此時Person的prototype被你賦值成了1,是個數(shù)字,數(shù)字本身的constructor當(dāng)然是繼承Number對象的。
但是此時Person本身是沒有發(fā)生改變的,你只是改變了他的prototype屬性。
然后

var p = new Person("Nicholas",18);

new了一個p,因?yàn)樵趎ew之前你已經(jīng)改變了Person的prototype,所以原本屬于prototype的constructor沒有被p繼承下來。那么p的constructor只能是從Object里拿的了,也就是最頂層的。
我們可以通過log(p)比較改Person.prototype 和不改Person.prototype ,對生成的p的影響。
不改

//...
consolg.log(p);//{name:'Nicholas',age:'18',__proto__:{constructor:Person(namn,age){...};__proto__:{constructor:Object(),...}}}

//...
consolg.log(p);//{name:'Nicholas',age:'18',__proto__:{constructor:Object(),...}}

很明顯少了一層__proto__,這一層__proto__里constructor的就是原本通過Person.prototype.constructor傳下來的,但是Person.prototype被改成1后就沒了。

2018年6月12日 19:56