閑聊js3: js面向?qū)ο缶幊?es6和jsface庫(kù)技術(shù)選型)

面向?qū)ο蟮娜筇匦? 繼承 封裝 多態(tài)

1. 子類(lèi)override基類(lèi)同名方法時(shí)出現(xiàn)問(wèn)題

原本要繼續(xù)寫(xiě)渲染器方面的東西,但是在過(guò)程中遇到一個(gè)問(wèn)題:根據(jù)JS學(xué)習(xí):nodejs中的類(lèi)定義和繼承的套路的套路,發(fā)現(xiàn)一個(gè)致命的問(wèn)題凡简,無(wú)法對(duì)子類(lèi)進(jìn)行override逼友,具體代碼如下:

父類(lèi)的render方法,繪制背景

BLFBaseSprite.prototype.render = function(render) {
    render.drawGrid('black', 'white', 10, 10);
}

子類(lèi)override父類(lèi)render方法秤涩,增加繪制文字

BLFBaseSprite.prototype.render = function(render) {
    render.drawGrid('black', 'white', 10, 10);
    render.drawText(10, 10, 'blue', "隨風(fēng)而行之青衫磊落險(xiǎn)峰行測(cè)試RenderSurface");
}

測(cè)試代碼:(創(chuàng)建的是BLFBaseSprite帜乞,原本是沒(méi)有文字的,但是實(shí)際卻顯示了文字)

 var canvas = document.getElementById("myCanvas");
 var context = canvas.getContext('2d');
 var render = new BLFRender(context);
 var base= BLFBaseSprite();
 base.render(render);

出問(wèn)題啦?鹁臁@枇摇!

出問(wèn)題.png

原因: 是因?yàn)閕nherits函數(shù)中子類(lèi)和父類(lèi)的prototype指向的對(duì)象是同一個(gè)匀谣,共享了同一個(gè)prototype

也不想多花時(shí)間在這方面照棋,于是決定選擇是使用es6還是jsface庫(kù)來(lái)進(jìn)行js面向?qū)ο蠓绞降木幊獭V劣谡f(shuō)typescript武翎,是我非常喜歡的一門(mén)語(yǔ)言烈炭,但是客戶(hù)端編程,就不選他了宝恶。

2. 測(cè)試es6和jsface面向?qū)ο缶幊痰哪芰?繼承 封裝 多態(tài))符隙。

繼承(包含子類(lèi)覆寫(xiě)父類(lèi)方法[override],以及子類(lèi)調(diào)用父類(lèi)方法)
jsface版本:

<script>
        //Class方法1
        var Base = Class({
            constructor: function(name) {
                this.name = name;
            },

            toString: function() {
                return this.name;
            }
        });

        //Class重載方法進(jìn)行繼承
        var Child = Class(Base, {
            //構(gòu)造函數(shù)增加一個(gè)id參數(shù)
            constructor: function(id, name) {
                this.id = id;
                //同時(shí)要調(diào)用基類(lèi)的構(gòu)造函數(shù)用于初始化name屬性
                Child.$super.call(this, name);
            },

            //override 基類(lèi)方法
            toString: function() {
                return this.name + '-' + this.id;
            }
        });

        var base = new Base("base");
        var child = new Child(1234, "child");
        alert(base.toString());
        alert(child.toString());
  </script>

es6版本:

<script>
       class ESBase {
            constructor(name) {
                this.name = name;
            }

            toString() {
                return this.name;
            }
        }

        class ESChild extends ESBase {
            constructor(id, name) {
                super(name); //調(diào)用基類(lèi)方法
                this.id = id;
            }

            //override基類(lèi)方法
            toString() {
                return this.name + '_' + this.id;
            }
        }

        var esBase = new ESBase("esBase");
        var esChild = new ESChild(4321, "esChild");
        alert(esBase.toString());
        alert(esChild.toString());
</script>

通過(guò)使用es6和jsface,完美解決今天碰到的問(wèn)題垫毙。其威力來(lái)源與子類(lèi)覆寫(xiě)父類(lèi)方法[override],以及子類(lèi)調(diào)用父類(lèi)方法這兩個(gè)關(guān)鍵功能霹疫。


封裝(數(shù)據(jù)隱藏)
封裝最簡(jiǎn)單的解釋就是java c# c++等面向?qū)ο笳Z(yǔ)言中的public/protected/private這些關(guān)鍵詞起的作用:

  • public: 表明該數(shù)據(jù)成員、成員函數(shù)是對(duì)所有用戶(hù)開(kāi)放的综芥,所有用戶(hù)都可以直接進(jìn)行調(diào)用
  • private:表示私有丽蝎,私有的意思就是除了class自己之外,任何人都不可以直接使用膀藐,私有財(cái)產(chǎn)神圣不可侵犯嘛征峦,即便是子女,朋友栏笆,都不可以使用。
  • protected:protected對(duì)于子女蛉加、朋友來(lái)說(shuō)缸逃,就是public的针饥,可以自由使用,沒(méi)有任何限制需频,而對(duì)于其他的外部class,protected就變成private昭殉。

數(shù)據(jù)隱藏功能要在js中完美實(shí)現(xiàn)藐守,難度非常大。并且感覺(jué)也沒(méi)必要蹂风。數(shù)據(jù)隱藏最大的功能是隱藏實(shí)現(xiàn)細(xì)節(jié)卢厂,提供公開(kāi)接口給第三方(面向接口編程)。js本身都是源碼隨意可見(jiàn)惠啄,因此封裝數(shù)據(jù)隱藏也就不用考慮了。
為了使用代碼更加清晰融柬,可以自行設(shè)計(jì)相關(guān)規(guī)則,例如:

  • 使用_開(kāi)頭表示protected方法或?qū)傩?/li>
  • 使用__開(kāi)頭表示私有方法或?qū)傩?/li>

多態(tài)(函數(shù)地址運(yùn)行時(shí)動(dòng)態(tài)綁定)
其實(shí)多態(tài)是建立在繼承和封裝的基礎(chǔ)上粒氧。強(qiáng)類(lèi)型語(yǔ)言需要多態(tài)機(jī)制棚品。js這種弱類(lèi)型語(yǔ)言,天生就是運(yùn)行時(shí)動(dòng)態(tài)綁定函數(shù)地址的铜跑,因此天生支持。也不用多講了掷空。

反正一句話(huà)囤锉,js中只要解決繼承(以及子類(lèi)覆寫(xiě)父類(lèi)方法[override],以及子類(lèi)調(diào)用父類(lèi)方法),我們就可以使用面向?qū)ο蠓绞骄幊坦俚亍R簿徒鉀Q了今天的一個(gè)關(guān)鍵問(wèn)題。

3. 技術(shù)選型

測(cè)試結(jié)果(我電腦上最新版的瀏覽器):

瀏覽器 es6 jsface
chrome yes yes
firefox yes yes
opera yes yes
ms edge yes yes
ms ie11 no yes

目前ie11還不支持es6,其他瀏覽器都完美支持赤炒。

從語(yǔ)法簡(jiǎn)明亏较,靜態(tài)函數(shù)支持,箭頭函數(shù)遵岩,let/const聲明等等等等角度來(lái)說(shuō)巡通,我決定選擇es6了
jsface兼容性的確非常不錯(cuò)尘执,但是畢竟我們是使用canvas2d webgl為主,所以還是用es6吧

我們換吧正卧!
換es6吧跪解!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叉讥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子图仓,更是在濱河造成了極大的恐慌,老刑警劉巖惶看,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件六孵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡本今,警方通過(guò)查閱死者的電腦和手機(jī)主巍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逛艰,“玉大人搞旭,你說(shuō)我怎么就攤上這事⊙〖梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵偏灿,是天一觀的道長(zhǎng)钝的。 經(jīng)常有香客問(wèn)我铆遭,道長(zhǎng)沿猜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任橄妆,我火速辦了婚禮祈坠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赦拘。我一直安慰自己,他們只是感情好阁猜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蹋艺。 她就那樣靜靜地躺著,像睡著了一般笛园。 火紅的嫁衣襯著肌膚如雪侍芝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天棵红,我揣著相機(jī)與錄音咧栗,去河邊找鬼。 笑死致板,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的素征。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼根欧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼端蛆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起今豆,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晚凿,失蹤者是張志新(化名)和其女友劉穎亭罪,沒(méi)想到半個(gè)月后歼秽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體情组,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡院崇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谢揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐凭。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖患民,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匹颤,我是刑警寧澤托猩,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站赦肃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摆尝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一勺爱、第九天 我趴在偏房一處隱蔽的房頂上張望讯检。 院中可真熱鬧,春花似錦人灼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烙样,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛤肌,已是汗流浹背批狱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狼速,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓向胡,卻偏偏與公主長(zhǎng)得像惊完,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拇派,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容