Javascript也是物件導向的語言,但它是一種基於原型Prototype的語言,而不是基於類別的語言。
在javaScript建立物件一文中提到過:用建構函式建立物件存在一個問題即同一建構函式的不同實例的相同方法是不一樣的,所以我們用原型把建構函式中公共的屬性和方法提取出來封裝,達到讓所有實例共享的目的。
function定義的物件有一個prototype屬性,prototype屬性又指向了一個prototype物件。在prototype物件中有一個constructor屬性,這個constructor屬性同樣指向一個constructor對象,而這個constructor物件恰恰就是這個function函數本身。
用偽代碼表示如下:
var function{ prototype:prototype{ constructor:constructor == function } }
函數與原型的關係
js中建立一個函數,就會自動建立一個prototype屬性,這個屬性指向函數的原型對象,並且原型對象會自動獲得一個constructor(建構子)屬性,指向該函數。
範例:以前面的原型模式建立物件為例說明
<script type="text/javascript"> function Person(){ } Person.prototype.name="lxy"; Person.prototype.age=22; Person.prototype.job="Software Engineer"; Person.prototype.sayName=function(){ alert(this.name); } var lxy=new Person(); lxy.sayName(); var personA=new Person(); personA.sayName(); alert(lxy.sayName()==personA.sayName());//true </script>
實例與原型的關係
透過建構函式建立一個實例,該實例內部將包含一個屬性(指標),指向建構函數的原型物件。
範例:Person建構子的實例Person1和Person2的[[Prototype]]屬性都指向Person的原型。
Note:[[Prototype]]連接是存在於實例和建構子的原型之間,而不是存在實例與建構子之間。
關於這個指針,ECMA-262中叫[[Prototype]],沒有標準的方式訪問[[Prototype]],但Firefox、Safari和Chrome在每個對像上都支援一個屬性__protp__,而在其他實作中,這個屬性對腳本不可見。
以上是js的prototype是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!