關於繼承好吧,說到底JS還是原型繼承的,而不是類繼承。所以在這個上面要經常用到prototype去繼承另一個對象。所有的構造器函數都約定命名為首字母大寫的形式,並且不以首字母大寫的形式拼寫任何其它的東西。當然一個更好的備選方案是根本就不用new。(太棒了,你說什麼就是什麼咯,我就當JS沒這個東西了)...
關於繼承
好吧,說到底JS還是原型繼承的,而不是類繼承。所以在這個上面要經常用到prototype去繼承另一個對象。
所有的構造器函數都約定命名為首字母大寫的形式,並且不以首字母大寫的形式拼寫任何其它的東西。當然一個更好的備選方案是根本就不用new。(太棒了,你說什麼就是什麼咯,我就當JS沒這個東西了)
為什麼呢,因為偽類模式就是一種畫虎不成反類犬的模式,它試圖去迎合我們這些玩類繼承的程式員,但是其實它還有更多更好的選擇。
那就是原型繼承,然後創建對象的時候函數化,這樣就可以對創建有私有變數的對象。
以下為構造器的例子:
var ObjectFactory=function(spec,my){//spec是一個傳遞的信息對象,其實按照我的理解這個東西就是跟閉包類似不是嗎,沒什麼新鮮的東西 var that;//要返回的對象 var name='troy';//私有變數 my =my||{};//構造時傳進來的對象 my.getName=function(){//將公共方法和屬性可以傳遞給my return name; } that={}; that.GetMyName=function(){//這是要創建的對象有的特有方法 return 'myname:'+name; } return that; }; var boy=ObjectFactory(1,anotherObj);
事實上上面的代碼中that.GetMyName更適合先建一個私有函數對象,然後再賦值給that.GetMyName,這樣的話這個方法GetMyName在被刪除或者替換後,私有方法不會被破壞。
函數化同樣提供了一個訪問父類的方法:
Object.AddMethod("getMyParent",function(funcName){ var that=this,method=that[funcName]; return function(){ return method.apply(that,arguments); }; })
通過以上方式我們就可以用getMyParent來調用父類的函數。
實際上我感覺
obj.getMyParent("getMyName")和obj.getMyName()的調用方式好像沒什麼區別,話說這裡我也沒搞懂什麼意思。如有懂的人請麻煩指正一下,謝謝。
部件的組裝可以從一套部件中將對象組裝起來,簡單來講就是對一個複雜對象進行組裝。感覺有點像建造者模式。