天天看點

Javascript構造函數與prototype

構造函數 構造函數的缺點 prototype的引入 prototype模式的驗證方法

在javascript語言中,new指令後面跟的不是類,而是構造函數(constructor)。

構造函數了解:

所謂"構造函數",其實就是一個普通函數,但是内部使用了this變量。對構造函數使用new運算符,就能生成執行個體,并且this變量會綁定在執行個體對象上。

比如,貓的原型對象可以這樣寫:

我們現在就可以生成執行個體對象了。

這時cat1和cat2會自動含有一個constructor屬性,指向它們的構造函數。

javascript還提供了一個instanceof運算符,驗證原型對象與執行個體對象之間的關系。

函數與對象的構造函數:

由上面的例子可以看出,通過new指令後面跟的不是類,而是構造函數。另外,對于使用var定義的對象,它的構造函數是對象(object),而不是function,可以了解為非構造函數。

用構造函數生成執行個體對象,有一個缺點,那就是無法共享屬性和方法。

我們現在為cat對象添加一個不變的屬性"type"(種類),再添加一個方法eat(吃老鼠)。那麼,原型對象cat就變成了下面這樣:

還是采用同樣的方法,生成執行個體:

這裡有一個很大的弊端。那就是對于每一個執行個體對象,type屬性和eat()方法都是一模一樣的内容,每一次生成一個執行個體,都必須為重複的内容,多占用一些記憶體。這樣既不環保,也缺乏效率:

引入prototype(原型)屬性,共享屬性和方法。執行個體對象一旦建立,将自動引用prototype對象的屬性和方法。也就是說,執行個體對象的屬性和方法,分成兩種,一種是本地的,另一種是引用的。

隻有構造函數才有prototype屬性。繼續使用上面建立的對象a,b:

javascript規定,每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的執行個體繼承。

我們可以把那些不變的屬性和方法,直接定義在prototype對象上。

同樣執行個體化出cat1和cat2,我們可以發現:

1) 使用hasownproperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype對象的屬性。

2) object1.isprototypeof(object2) 判斷object1是否存在于另一個對象object2的原型鍊中

3) in運算符

繼續閱讀