01.JavaScript面向?qū)ο缶幊?/h1>

JavaScript作為一門動態(tài)類型語言,它在編譯(解釋)時沒有類型檢查的過程纯路,既沒有檢查創(chuàng)建創(chuàng)建的對象類型或油,有沒有檢查傳遞的參數(shù)類型。


我的讀書筆記感昼,我想來記錄一下自己認識的JavaScript的多態(tài)装哆,多態(tài)是面向?qū)ο缶幊陶Z言中最最重要的技術(shù),個人理解多態(tài)就是把“做什么”和“誰去做”分離出來,歸根結(jié)底就是消除類型之間的耦合關(guān)系蜕琴。

畢竟大部分人都不關(guān)心雞是怎么叫萍桌,也不想知道鴨是怎么叫。

多態(tài)的最根本的好處在于凌简,你不必再向?qū)ο笤儐枴澳闶鞘裁搭愋汀鄙涎祝蟾鶕?jù)得到的答案調(diào)用某個對象的行為--你只管調(diào)用該行為就是了,其他的一切多態(tài)機制都會為你安排妥當雏搂!

將行為分布在各個對象中藕施,并讓這些對象各自負責自己的行為,這正是面向?qū)ο笤O(shè)計的特點

1.多態(tài)

        /*
        * 編寫一個地圖的應(yīng)用凸郑,我們可能需要調(diào)用百度地圖裳食,搜狗地圖,谷歌地圖等應(yīng)用
        * 那么我們現(xiàn)在就來完成對多態(tài)的體現(xiàn)的代碼應(yīng)用
        * */
        var googleMap = {
            show:function () {
                console.log("開始渲染谷歌地圖");
            }
        }
        var baidudMap={
            show:function () {
                console.log("開始選擇百度地圖");
            }
        }

        //建立渲染的方法
        var renderMap = function(map/*傳遞地圖對象*/){
            //判斷你調(diào)用的show的類型是否為函數(shù)芙沥?
            if(map.show instanceof Function){
                map.show();
            }
        }

        //測試
        renderMap(googleMap);
        renderMap(baidudMap);

翻譯如下: 當我們想谷歌地圖對象和百度地圖對象分別發(fā)出“展示地圖”的消息時候诲祸,分別調(diào)用他們的show方法,就會產(chǎn)生不同的執(zhí)行結(jié)果而昨。對象的多態(tài)性提示我們救氯,“做什么”和“怎么做”是可以分開的,以后增加搜狗地圖歌憨,renderMap函數(shù)仍然不需要做任何變化着憨!

2.封裝

在多數(shù)的對象語言中,封裝數(shù)據(jù)是由語法解析實現(xiàn)的务嫡。例如我們學(xué)習的Java語言提供了private甲抖、public、protected等關(guān)鍵字來提供不同的訪問權(quán)限

但是植袍,JavaScript中并沒提供這些訪問權(quán)限的關(guān)鍵字惧眠,我們只能依賴 變量的作用域來實現(xiàn)封裝特性,而且只能模擬出public和private這兩種封裝性

        var hpObject = (function () {
            var __name="胖先森";//私有(private)變量
            return {
                getName:function () {// 公開(public)方法
                    return __name;
                }
            }
        })();

        console.log(hpObject.getName()); // 輸出:胖先森
        console.log(hpObject.__name); // 輸出:undefined


目前通過函數(shù)創(chuàng)建作用域比較常見于个,如果你使用的ECMAScript 6 抱歉我沒有研究,但是知道其提供了 let 關(guān)鍵字暮顺,定義私有變量

上面僅僅是一個封裝數(shù)據(jù)的示例厅篓,但是不要說封裝等同于封裝數(shù)據(jù),這樣就是井底之蛙捶码!

封裝實現(xiàn)的目的:將信息隱藏羽氮,封裝應(yīng)該被視為“任何形式的封裝”,也就是說惫恼,封裝不僅僅是隱藏數(shù)據(jù)档押,還包括隱藏實現(xiàn)細節(jié),設(shè)計細節(jié)以及隱藏對象的類型等挺邀。

什么時候使用封裝呢祠斧? 個人的理解為:找到變化并封裝之饥侵,這里就涉及到設(shè)計模式(面試題:一共有多少設(shè)計模式呢尸变?)哗总,還有如果工作一些年了琳轿,你應(yīng)該知道重構(gòu)代碼的重要性户侥!

通過封裝剔猿,我們要達到什么目的呢癞松?就是把系統(tǒng)中 穩(wěn)定不變的部分容易變化的部分 隔離爽撒!

3.繼承

主要說一下JavaScript的原型繼承,這里自己也是剛剛?cè)腴T响蓉,如果不太好的地方見諒硕勿!

需要大家記住,原型編程的基本準則:

  • 所有數(shù)據(jù)都是對象 “萬物皆對象”
  • 要得到一個對象枫甲,不是通過 實例化源武,而是找到一個對象作為原型并 克隆它
  • 對象會記住它的原型(你的父親你不記得?)
  • 如果對象無法響應(yīng)某個請求言秸,它會把這個請求委托給它自己的原型软能。(例如,自己克隆自己)

(1)所有數(shù)據(jù)都是對象

JavaScript的數(shù)據(jù)類型機制: 基本類型和對象類型

基本類型包括:

  • 特殊數(shù)據(jù)類型
    • undefined
    • null
  • 基本數(shù)據(jù)類型
    • string
    • boolean
    • number
  • 復(fù)雜數(shù)據(jù)類型
    • object
    • function (這個好像不算)

ECMAScript 6 里面增加了一個數(shù)據(jù)類型 symbol

JavaScript作者本意是除了undefined以外举畸,一切都是對象查排!為了實現(xiàn)這個目標number、boolean抄沮、string這幾種基本數(shù)據(jù)類型也是通過“包裝類(學(xué)Java的時候有類似的概念)”的方式變成對象類型數(shù)據(jù)來處理跋核。

我們不能說JavaScript的多有數(shù)據(jù)都是對象,但是絕大部分都是對象叛买。那么JavaScript中一定會有一個 根對象 存在

事實上砂代,JavaScript中的跟對象是 Object.prototype 對象。Object.prototype 對象是一個 空的對象率挣,實際上都是從 Object.prototype 對象克隆而來的刻伊。

        var hp01 = new Object();//聲明一個對象
        var hp02 = {};// 創(chuàng)建一個對象,推薦方式

        //利用 Object.getPrototypeOf方法檢測原型
        console.log(Object.getPrototypeOf(hp01) === Object.prototype);// 輸出:true

        console.log(Object.getPrototypeOf(hp02) === Object.prototype);// 輸出:true

(2)要得到一個對象椒功,不是通過實例化類捶箱,而是找到一個對象作為原型并克隆它

在JavaScript語言中,我們不需要關(guān)心克隆的細節(jié)动漾,而是由引擎內(nèi)部負責實現(xiàn)的丁屎。

那么,我就有一個疑問:new 運算符不是實例化嗎旱眯? 我們看一下下面的經(jīng)典代碼:


       function Person( name ){
           this.name = name;
       }
       Person.prototype.getName = function () {
           return this.name;
       }

       var a = new Person("胖先森");
       console.log(a.name);  // 輸出:胖先森
       console.log(a.getName()); //輸出:胖先森

       //檢查對象
        console.log(Object.getPrototypeOf(a) === Person.prototype);// 輸出:true

在JavaScript中沒有類的概念晨川,這句話必須要時刻保持警惕证九!

但是,剛才明明不是已經(jīng)調(diào)用了 new Person() 嗎共虑?如果按照Java的理解愧怜,這不就是實例化對象嗎?

在這里Person不是類看蚜,而是 函數(shù)構(gòu)造器叫搁,JavaScript的函數(shù)既可以作為 普通函數(shù) 被調(diào)用 ,也可以作為 構(gòu)造函數(shù) 被調(diào)用供炎。用 new 運算符來創(chuàng)建對象的過程渴逻,實際上是

先克隆了 Object.prototype 對象 ,再進行一些其他額外的操作過程:

JavaScript是通過克隆 Object.prototype 來得到新的對象音诫,但是實際上不是每次都真正克隆一個新對象惨奕。

從內(nèi)存方面考慮出發(fā),JavaScript還是做了一些額外的處理竭钝。

(3)對象會記住它的原型

記桌孀病:JavaScript給對象提供了隱藏屬性 __proto__ ,某個對象的 __proto__ 屬性會默認指向它的構(gòu)造器的 原型對象 ,即 {Constructor}.prototype 香罐。

      var hp = new Object();
      console.log(hp.__proto__ === Object.prototype);

__proto__就是對象跟“對象構(gòu)造器的原型” 聯(lián)系起來的紐帶卧波。

這個地方我理解的還是不夠透徹,在后面的學(xué)習中庇茫,繼續(xù)努力港粱!

(4)如果對象無法響應(yīng)某個請求,它會把這個請求委托給它自己的原型

JavaScript中每個對象都是從 Object.prototype 對象克隆而來旦签。如果這樣的話查坪,就特別像我們之前學(xué)習的Java一樣就成為了單一繼承,即每個對象都繼承了 Object.prototype , 顯示這樣的設(shè)計是受到了一定的限制宁炫。

實際上偿曙,雖然JavaScript的對象最初都是由Object.prototype對象克隆而來,但是對象 構(gòu)造器的言行并不是限于Object.prototype 上羔巢,而是可以 動態(tài) 指向其他對象望忆。

一段比較經(jīng)典的繼承寫法:

     var root = {name:"胖先森"};

      var A = function () {

      }
      A.prototype = root;

      var a = new A();
      console.log(a.name);

比較常用的方式

說在后面的話:

花了一天時間,整理出來一點筆記竿秆! 如果感覺好炭臭,請記得打賞一下!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末袍辞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子常摧,更是在濱河造成了極大的恐慌搅吁,老刑警劉巖威创,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谎懦,居然都是意外死亡肚豺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門界拦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吸申,“玉大人,你說我怎么就攤上這事享甸〗夭辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蛉威,是天一觀的道長日丹。 經(jīng)常有香客問我,道長蚯嫌,這世上最難降的妖魔是什么哲虾? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮择示,結(jié)果婚禮上束凑,老公的妹妹穿的比我還像新娘。我一直安慰自己栅盲,他們只是感情好汪诉,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剪菱,像睡著了一般摩瞎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孝常,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天旗们,我揣著相機與錄音,去河邊找鬼构灸。 笑死上渴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喜颁。 我是一名探鬼主播稠氮,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼半开!你這毒婦竟也來了隔披?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤寂拆,失蹤者是張志新(化名)和其女友劉穎奢米,沒想到半個月后抓韩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鬓长,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年谒拴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涉波。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡英上,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啤覆,到底是詐尸還是另有隱情苍日,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布城侧,位于F島的核電站易遣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嫌佑。R本人自食惡果不足惜豆茫,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋摇。 院中可真熱鬧揩魂,春花似錦、人聲如沸炮温。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒啤。三九已至倦挂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間担巩,已是汗流浹背方援。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涛癌,地道東北人犯戏。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像拳话,于是被迫代替她去往敵國和親先匪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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