本文力求用最短的語(yǔ)言總結(jié)這塊地知識(shí)點(diǎn)
好的!開始!
(1) 原型對(duì)象
先看一段代碼:
function Peroson(){
}
Person.prototype.name = 'Jack';
var person1 = new Person();
person1.name
var person2 = new Person();
person2.name
Person函數(shù)創(chuàng)建之后,默認(rèn)會(huì)有 prototype 屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象,即:Person.prototype
默認(rèn)情況下,所有原型對(duì)象都會(huì)有一個(gè) constructor (構(gòu)造函數(shù))屬性,指向 prototype 屬性所在函數(shù)的指針
即:Person.prototype.constructor ==> Person
原型對(duì)象中除了 constructor 屬性,其他的方法,是從 Object 繼承而來(lái)
當(dāng)創(chuàng)建了一個(gè)新實(shí)例后,該實(shí)例內(nèi)部將會(huì)有一個(gè) proto 屬性,僅僅指向構(gòu)造函數(shù)的原型對(duì)象。即 Person.prototype
需要明確一點(diǎn)的是:實(shí)例的 proto 連接,存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間,而不是存在于實(shí)例與構(gòu)造函數(shù)之間
確定實(shí)例是否是該函數(shù)的實(shí)例:
Perosn.prototype.isPrototypeOf(person1)
如果實(shí)例中屬性和原型中屬性同名,則實(shí)例中屬性會(huì)屏蔽原型中屬性,但是不會(huì)重寫。
(2) 繼承
原理:利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法
具體做法:讓原型對(duì)象等于需要繼承的構(gòu)造函數(shù)的一個(gè)實(shí)例
示例:
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
}
function SubType(){
this.subproperty = false;
}
// 繼承了 SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
return this.subproperty;
}
var instance = new SubType();
instance.getSuperValue() // true
實(shí)現(xiàn)的本質(zhì)是:重寫原型對(duì)象,代之以一個(gè)新類型的實(shí)例
通過(guò)實(shí)現(xiàn)原型鏈,本質(zhì)上擴(kuò)展了原型搜索機(jī)制
確定原型和實(shí)例之間的關(guān)系
(1) instance instanceof Object
(2) SubType.prototype.isPrototypeOf(instance)