構造函數 構造函數的缺點 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運算符