理解JavaScript的prototype屬性
更新時間:2012年02月11日 23:30:16 作者:
JavaScript可以說是最讓人初學(xué)者難以理解的單一屬性。我看了一些資料后,開始明白其實這些困難很大程度來自prototype這個名字本身的二義性
其實,關(guān)于prototype只要幾句話就可以總結(jié):
任何原型都是對象,只有對象有原型
只有Function有prototype屬性,它是這個Function作為構(gòu)造器時生成對象所繼承的原型。Function的原型和它的prototype屬性無關(guān)
對象的原型可以通過非標(biāo)準(zhǔn)的屬性 __proto__ 或ECMAScript5的方法 Object.getPrototypeOf() 訪問。
1其實是錯的,Object這個原型鏈盡頭的對象它沒有原型。可是為了更簡單表述。在看原型鏈后你就會明白.toString()這類沒有定義過的方法是怎樣來的。
上面說的二義性,是文字理解上的,語法本身沒有歧義。prototype是原型的意思,可是一個對象的原型不是由prototype去訪問。
Function有prototype屬性,可是和自己的原型沒有關(guān)系。理解這點后,再去看關(guān)于原型鏈、繼承的文章就容易理解多了。
下面是些例子,可以加深認(rèn)識:
// 任何對象都有原型
obj = {};
console.log( obj.__proto__ );
console.log( Object.getPrototypeOf(obj) );
console.log( obj.__proto__ === Object.getPrototypeOf(obj) );
//對象并沒有語法意義的prototype屬性
alert(obj.prototype) //undefined
//prototype作為一個屬性,僅存在于Function中,代表以這個Function創(chuàng)建的新實例集成的原型,和Function本身的原型無關(guān)
var F = function(name){
this.name = name;
}
obj = {a:3,
get b (){
return this.a;
}
};
F.prototype = obj;
newObj = new F('new name');
newObj.name; //作為構(gòu)造器,name是newObj的自身屬性
newObj.a; //3
//它繼承了obj??梢酝ㄟ^這樣證實:
Object.getPrototypeOf( newObj ) === obj; // true
newObj.__proto__ === obj; //true
任何原型都是對象,只有對象有原型
只有Function有prototype屬性,它是這個Function作為構(gòu)造器時生成對象所繼承的原型。Function的原型和它的prototype屬性無關(guān)
對象的原型可以通過非標(biāo)準(zhǔn)的屬性 __proto__ 或ECMAScript5的方法 Object.getPrototypeOf() 訪問。
1其實是錯的,Object這個原型鏈盡頭的對象它沒有原型。可是為了更簡單表述。在看原型鏈后你就會明白.toString()這類沒有定義過的方法是怎樣來的。
上面說的二義性,是文字理解上的,語法本身沒有歧義。prototype是原型的意思,可是一個對象的原型不是由prototype去訪問。
Function有prototype屬性,可是和自己的原型沒有關(guān)系。理解這點后,再去看關(guān)于原型鏈、繼承的文章就容易理解多了。
下面是些例子,可以加深認(rèn)識:
復(fù)制代碼 代碼如下:
// 任何對象都有原型
obj = {};
console.log( obj.__proto__ );
console.log( Object.getPrototypeOf(obj) );
console.log( obj.__proto__ === Object.getPrototypeOf(obj) );
//對象并沒有語法意義的prototype屬性
alert(obj.prototype) //undefined
//prototype作為一個屬性,僅存在于Function中,代表以這個Function創(chuàng)建的新實例集成的原型,和Function本身的原型無關(guān)
var F = function(name){
this.name = name;
}
obj = {a:3,
get b (){
return this.a;
}
};
F.prototype = obj;
newObj = new F('new name');
newObj.name; //作為構(gòu)造器,name是newObj的自身屬性
newObj.a; //3
//它繼承了obj??梢酝ㄟ^這樣證實:
Object.getPrototypeOf( newObj ) === obj; // true
newObj.__proto__ === obj; //true
您可能感興趣的文章:
相關(guān)文章
JS實現(xiàn)仿餓了么在瀏覽器標(biāo)簽頁失去焦點時網(wǎng)頁Title改變
這篇文章主要介紹了JS實現(xiàn)仿餓了么在瀏覽器標(biāo)簽頁失去焦點時網(wǎng)頁Title改變,需要的朋友可以參考下2017-06-06javascript正則表達(dá)式之search()用法實例
這篇文章主要介紹了javascript正則表達(dá)式之search()用法,實例分析了search()的使用技巧,需要的朋友可以參考下2015-01-01JS中setTimeout的巧妙用法前端函數(shù)節(jié)流
這篇文章主要介紹了JS中setTimeout的巧妙用法前端函數(shù)節(jié)流 的相關(guān)資料,需要的朋友可以參考下2016-03-03