首頁 >web前端 >js教程 >javascript prototype屬性是什麼?以及實例化物件的三個步驟

javascript prototype屬性是什麼?以及實例化物件的三個步驟

伊谢尔伦
伊谢尔伦原創
2017-07-20 15:42:451537瀏覽

 Js所有的函數都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數包括建構函數和普通函數,我們講的比較是構造函數的原型,但是也不能否定普通函數也有原型。譬如普通函數: 

function F(){ 
  alert(F.prototype instanceof Object) //true; 
}

建構函數,也即建構物件。首先了解下透過建構函數實例化物件的過程。

function A(x){ 
  this.x=x; 
} 
var obj=new A(1);

實例化obj物件有三個步驟: 
1. 建立obj物件:obj=new Object(); 

2. 將obj的內部__proto__指向建構他的函數A的prototype,同時,obj.constructor===A.prototype.constructor(這個是永遠成立的,即使A.prototype不再指向原來的A原型,也就是說:類的實例物件的constructor屬性永遠指向"建構子"的prototype.constructor),從而使得obj.constructor.prototype指向A.prototype(obj.constructor.prototype===A.prototype,當A.prototype改變時則不成立,下文有遇到)。 obj.constructor.prototype與的內部_proto_是兩碼事,實例化物件時用的是_proto_,obj是沒有prototype屬性的,但是有內部的__proto__,透過__proto__來取得原型鏈上的原型屬性和原型方法,FireFox公開了__proto__,可以在FireFox中alert(obj.__proto__); 

3. 將obj作為this去呼叫建構子A,從而設定成員(即物件屬性和物件方法)並初始化。 
當這3步完成,這個obj物件就與建構子A再無聯繫,這個時候即使建構子A再加任何成員,都不再影響已經實例化的obj物件了。此時,obj物件具有了x屬性,同時具有了建構函數A的原型物件的所有成員,當然,此時該原型物件是沒有成員的。 

原型物件初始是空的,也就是沒有一個成員(即原型屬性和原型方法)。可以透過以下方法驗證原型物件具有多少成員。

var num=0; 
for(o in A.prototype) { 
  alert(o);//alert出原型属性名字 
  num++; 
} 
alert("member: " + num);//alert出原型所有成员个数。

但是,一旦定義了原型屬性或原型方法,則所有透過該建構函式實例化出來的所有對象,都繼承了這些原型屬性和原型方法,這是透過內部的_proto_鏈來實現的。 

A.prototype.say=function(){alert("Hi")};

那所有的A的物件都具有了say方法,這個原型物件的say方法是唯一的副本給大家共享的,而不是每一個物件都有關於say方法的一個副本。

以上是javascript prototype屬性是什麼?以及實例化物件的三個步驟的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn