前一篇章講了原型鏈繼承基括,那原型鏈怎么理解呢,是時候來講一下了:
我們查找一個實例對象的屬性或方法匠璧,首先會在自己的實例屬性或方法中查找,找到這個屬性或方法酿雪,那么這屬于私有屬性或方法指黎;如果沒有則根據(jù)指針鏈(__proto__
)到當前實例所屬類型的原型對象上找醋安,找到這個屬性或方法,那么這個屬性或方法屬于公有屬性或方法柠辞,若還沒有叭首,則繼續(xù)通過指針鏈(__proto__
)往上找放棒,一直找到Object.prototype上還沒有則說明這個對象是沒有原型對象的
function Fn(){
this.x = 100;
}
Fn.prototype.showX = function () {
console.log(this.x)
}
var fn = new Fn();
console.log(fn)
原型鏈在控制臺展示這樣的:
下面是一張原型鏈的草圖:
所謂原型鏈只得就是圖中
__proto__
這一條指針鏈厢破,而原型鏈的頂端就是Object.__proto__
每個對象都有
__proto__
屬性笆焰,Object
對象除外嚷掠;每個構(gòu)造函數(shù)都有一個名為
prototype
的原型對象不皆,這個原型對象同樣帶有__proto__
屬性霹娄;每個對象的
__proto__
屬性都指向自身構(gòu)造函數(shù)的prototype
原型對象。isPrototypeOf()
可以用來判斷對象object1
是否存在于對象object2
的原型鏈中枕磁,是則返回true
透典,不是返回false
function Fn(){
this.x = 100;
}
Fn.prototype.showX = function () {
console.log(this.x)
}
var fn = new Fn();
console.log(Fn.prototype.isPrototypeOf(fn)); //true
如果 object2 的原型鏈中包含object1,那么 isPrototypeOf 方法返回 true凑队。
如果 object2 不是一個對象或者 object1 沒有出現(xiàn)在 object2 中的原型鏈中盟劫,isPrototypeOf 方法將返回false霍狰。
需要注意的指向是
Function.prototype的proto指向其構(gòu)造函數(shù)Object的prototype康震;
Object.prototype的prototype指向null(盡頭)
console.log(Function.prototype.isPrototypeOf(Object)); //true
console.log(Object.prototype.isPrototypeOf(Function)); //true
console.log(Object.prototype.__proto__); //null
console.log(Function.prototype.__proto__)
附上一張完整的原型鏈圖: