日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【cocos2d-x从c++到js】06:Google的继承写法解析

發布時間:2023/12/31 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【cocos2d-x从c++到js】06:Google的继承写法解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

cocos2d-x for js中集成了兩套繼承寫法,一套是JR的,一套是google。公司同事使用過node.js,對google的繼承方式比較贊同。我就看了一下Google的繼承代碼。

先貼代碼:

  • //?1)?Google?"subclasses"?borrowed?from?closure?library?
  • //?This?is?the?recommended?way?to?do?it?
  • //?
  • cc.inherits?=?function?(childCtor,?parentCtor)?{?
  • ????/**?@constructor?*/?
  • ????function?tempCtor()?{};?
  • ????tempCtor.prototype?=?parentCtor.prototype;?
  • ????childCtor.superClass_?=?parentCtor.prototype;?
  • ????childCtor.prototype?=?new?tempCtor();?
  • ????childCtor.prototype.constructor?=?childCtor;?
  • ?
  • ????//?Copy?"static"?method,?but?doesn't?generate?subclasses.?
  • //??for(?var?i?in?parentCtor?)?{?
  • //??????childCtor[?i?]?=?parentCtor[?i?];?
  • //??}?
  • };?
  • cc.inherits是繼承函數,負責鏈接父類和子類的原型鏈。非常有趣的是,在這里使用了一個臨時構造器,這樣就替換了JR代碼中的initializing 寫法。看起來很舒服。

    ?

  • cc.base?=?function(me,?opt_methodName,?var_args)?{??
  • ????var?caller?=?arguments.callee.caller;??
  • ????if?(caller.superClass_)?{??
  • ????????//?This?is?a?constructor.?Call?the?superclass?constructor.??
  • ????????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?we?did?not?find?the?caller?in?the?prototype?chain,??
  • ????//?then?one?of?two?things?happened:??
  • ????//?1)?The?caller?is?an?instance?method.??
  • ????//?2)?This?method?was?not?called?by?the?right?caller.??
  • ????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的继承写法解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。