所有引用型別(函式,陣列,物件)都擁有__proto__屬性(隱式原型)
所有函式擁有prototype屬性(顯式原型)(僅限函式)
原型物件:擁有prototype屬性的物件,在定義函式時就被建立
//建立建構函式
function
human
(hname,hage)
human.prototype.
intr
=function()
,今年$歲`)
;}//建立例項
var zhangsan =
newhuman
('張三',20
);var lisi =
newhuman
('李四',23
);zhangsan.
intr()
;//我是張三,今年20歲
lisi.
intr()
;//我是李四,今年23歲
通過建構函式建立的例項,原型都指向建構函式的prototype屬性,zhangsan和lisi中都沒有intr屬性,但能正常輸出,是因為繼承了建構函式human的原型,使用了原型中的屬性。
查詢屬性時,如果本身沒有,就會去__proto__中查詢,也就是建構函式的顯式原型中查詢,如果建構函式中也沒有該屬性,因為建構函式也是物件,也有__proto__,那麼會去它的顯式原型中查詢,一直到null,如果沒有則返回undefined,期間如果找到了,便會直接使用找到的屬性。
由__proto__連線形成的鏈式關係就是原型鏈
zhangsan.__proto__.constructor == function human(){}
lisi.__proto__.constructor == function human(){}
zhangsan.___proto__.__proto__== object.prototype
lisi.___proto__.__proto__== object.prototype
zhangsan.___proto__.__proto__.__proto__== object.prototype.__proto__ == null
lisi.___proto__.__proto__.__proto__== object.prototype.__proto__ == null
例項.通過__proto__形成原型鏈而非protrotype,因為張三和李四是通過同乙個建構函式建立的,因此他們的原型鏈相同。
關係大致如下圖: JS原型和原型鏈
建立建構函式 function word words word.prototype 建立例項 var w new word hello world w.print function w.print hello world w.alert hello world function.prototype....
js原型鏈和原型
1 原型 在js中一切皆物件,那原型也是乙個物件,通過原型可以實現物件的屬性繼承,js的物件中包含著乙個 prototype 內部屬性,這個屬性所對應的就是物件的原型。prototype 作為物件的內部屬性不能被直接訪問,所以為了方便檢視乙個物件的原型,提供了 proto 這個非標準的訪問器,在js...
JS 原型和原型鏈
先宣告乙個建構函式 function people name,age 把類的方法寫在建構函式原型物件中,子類就不能再通過呼叫父類建構函式來繼承方法 屬性還是可以繼承 給people的原型新增方法 people.prototype.speak function 建立子類繼承people functio...