理解JavaScript的prototype屬性

來源:互聯網
上載者:User

其實,關於prototype只要幾句話就可以總結:
任何原型都是對象,只有對象有原型
只有Function有prototype屬性,它是這個Function作為構造器時產生對象所繼承的原型。Function的原型和它的prototype屬性無關
對象的原型可以通過非標準的屬性 __proto__ 或ECMAScript5的方法 Object.getPrototypeOf() 訪問。
1其實是錯的,Object這個原型鏈盡頭的對象它沒有原型。可是為了更簡單表述。在看原型鏈後你就會明白.toString()這類沒有定義過的方法是怎樣來的。
上面說的二義性,是文字理解上的,文法本身沒有歧義。prototype是原型的意思,可是一個對象的原型不是由prototype去訪問。
Function有prototype屬性,可是和自己的原型沒有關係。理解這點後,再去看關於原型鏈、繼承的文章就容易理解多了。

下面是些例子,可以加深認識: 複製代碼 代碼如下:// 任何對象都有原型
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建立的新執行個體整合的原型,和Function本身的原型無關
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; //作為構造器,name是newObj的自身屬性
newObj.a; //3
//它繼承了obj。可以通過這樣證實:
Object.getPrototypeOf( newObj ) === obj; // true
newObj.__proto__ === obj; //true

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.