生活随笔
收集整理的這篇文章主要介紹了
【cocos2d-x从c++到js】06:Google的继承写法解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
cocos2d-x for js中集成了兩套繼承寫法,一套是JR的,一套是google。公司同事使用過node.js,對google的繼承方式比較贊同。我就看了一下Google的繼承代碼。
先貼代碼:
???cc.inherits?=?function?(childCtor,?parentCtor)?{??????????function?tempCtor()?{};?????tempCtor.prototype?=?parentCtor.prototype;?????childCtor.superClass_?=?parentCtor.prototype;?????childCtor.prototype?=?new?tempCtor();?????childCtor.prototype.constructor?=?childCtor;??????????};? cc.inherits是繼承函數,負責鏈接父類和子類的原型鏈。非常有趣的是,在這里使用了一個臨時構造器,這樣就替換了JR代碼中的initializing 寫法。看起來很舒服。
?
cc.base?=?function(me,?opt_methodName,?var_args)?{??????var?caller?=?arguments.callee.caller;??????if?(caller.superClass_)?{???????????????????ret?=??caller.superClass_.constructor.apply(?me,?Array.prototype.slice.call(arguments,?1));??????????return?ret;??????}????????var?args?=?Array.prototype.slice.call(arguments,?2);??????var?foundCaller?=?false;??????for?(var?ctor?=?me.constructor;??????????ctor;?ctor?=?ctor.superClass_?&&?ctor.superClass_.constructor)?{??????????if?(ctor.prototype[opt_methodName]?===?caller)?{??????????????foundCaller?=?true;??????????}?else?if?(foundCaller)?{??????????????return?ctor.prototype[opt_methodName].apply(me,?args);??????????}??????}????????????????????????????if?(me[opt_methodName]?===?caller)?{??????????return?me.constructor.prototype[opt_methodName].apply(me,?args);??????}?else?{??????????throw?Error(??????????????????????'cc.base?called?from?a?method?of?one?name?'?+??????????????????????'to?a?method?of?a?different?name');??????}??};?? cc.base是在子類函數中調用父類同名函數的方法。要使用這個函數,必須是使用過cc.inherits進行過鏈接原型鏈的類才行。參數方面,me需要傳入this,其他根據形參表來定。
var?caller?=?arguments.callee.caller;? 首先通過,上面的代碼獲得外層函數的對象。(據說caller這個屬性已經不再建議使用了,不知道是什么原因)。
然后,如果外層函數是構造函數的話,一定是存在superClass_這個屬性的。那么可以用apply調用父類的構造器,然后就退出函數執行就可以了。(但是這里為什么會有返回值呢,他喵的構造器返回值不是被運行環境給接管了么?)
var?args?=?Array.prototype.slice.call(arguments,?2);???????var?foundCaller?=?false;???????for?(var?ctor?=?me.constructor;???????????ctor;?ctor?=?ctor.superClass_?&&?ctor.superClass_.constructor)?{???????????if?(ctor.prototype[opt_methodName]?===?caller)?{???????????????foundCaller?=?true;???????????}?else?if?(foundCaller)?{???????????????return?ctor.prototype[opt_methodName].apply(me,?args);???????????}???????}??? 如果外層函數不是構造函數,那么就是子類的普通函數。后面的代碼也很簡單,從子類向上往父類上面找,一層一層的遍歷構造器,然后再核對同名函數,如果在當前層次找到了對應的函數名,就在下一輪循環中,調用父類的同名函數即可。然后直接返回。
if?(me[opt_methodName]?===?caller)?{???????????return?me.constructor.prototype[opt_methodName].apply(me,?args);???????}?else?{???????????throw?Error(???????????????????????'cc.base?called?from?a?method?of?one?name?'?+???????????????????????'to?a?method?of?a?different?name');???????}??? 如果要調用的那個函數,既不是構造函數,也不是父類中的同名函數。那么只有一種可能,就是這個函數是子類的一個實例上的函數。直接apply調用就好了。
再找不到的話,代碼就會抽風了。(throw Error)
?
綜上,google的代碼風格非常流暢,可讀性也很高。如果JR是很黃很暴力,各種奇技淫巧不計其數。那么google的代碼就是和風細雨,潤物細無聲。
就我個人而已,非常喜歡JR的接口,但是又喜歡google的內部實現。矛盾啊,喵了個咪。
另外,google的代碼可以做到很容易的和其他繼承機制兼容,但JR的就不行,必須已自己為核心來搞才可以的。這些是由他們的實現機制決定的。
目前來說,cocos2d-x for js使用JR的寫法,不知道會不會對將來的擴展造成一些問題呢。
?
?
轉載于:https://blog.51cto.com/goldlion/1127112
總結
以上是生活随笔為你收集整理的【cocos2d-x从c++到js】06:Google的继承写法解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。