一:幾個名詞
- 構造函數(shù)(constructor):專門用來生成實例對象的函數(shù)
- 原型對象(prototype):就是定義所有實例對象共享的屬性和方法的對象
二:三者之間的關系
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("孟婆")
p.sayName();
- Y1.PNG
- 任何函數(shù)都具有一個 prototype 屬性,該屬性是一個對象
- 構造函數(shù)的 prototype 對象默認都有一個 constructor 屬性走诞,指向 prototype 對象所在函數(shù)
- 通過構造函數(shù)得到的實例對象內(nèi)部會包含一個指向構造函數(shù)的 prototype 對象的指針
__proto__
三:原型鏈
JavaScript 規(guī)定副女,所有對象都有自己的原型對象(prototype)。一方面蚣旱,任何一個對象碑幅,都可以充當其他對象的原型;另一方面塞绿,由于原型對象也是對象沟涨,所以它也有自己的原型。因此异吻,就會形成一個“原型鏈”(prototype chain):對象到原型裹赴,再到原型的原型……
如果一層層地上溯喜庞,所有對象的原型最終都可以上溯到Object.prototype,即Object構造函數(shù)的prototype屬性棋返。也就是說延都,所有對象都繼承了Object.prototype的屬性。這就是所有對象都有valueOf和toString方法的原因睛竣,因為這是從Object.prototype繼承的晰房。
那么,Object.prototype對象有沒有它的原型呢射沟?回答是Object.prototype的原型是null殊者。null沒有任何屬性和方法,也沒有自己的原型验夯。因此猖吴,原型鏈的盡頭就是null。