OOP

什么是面向?qū)ο? 程序中都是用對象結(jié)構(gòu)描述現(xiàn)實中一個具體事物

什么是對象: 程序中專門描述現(xiàn)實中一個具體事物的程序結(jié)構(gòu)
為什么: 現(xiàn)實中,一個數(shù)據(jù)态兴,必須屬于某個具體對象中,才有意義仔拟。
何時: 今后厨诸,只要描述一個事物,都要將事物的屬性和功能集中定義在一個對象中

如何: 面向?qū)ο笕筇攸c:
封裝蜜托,繼承,多態(tài)

封裝:

什么是: 創(chuàng)建一個對象霉赡,存儲一個事物的屬性和功能
其中: 事物的屬性橄务,會成為對象的屬性
屬性其實就是存在對象中的變量
事物的功能,會成為對象的方法
方法其實就是存在對象中的函數(shù)
功能和屬性穴亏,統(tǒng)稱為成員
為什么: 便于大量維護數(shù)據(jù)
何時: 只要使用面向?qū)ο蟮姆绞骄幊谭渑玻急仨毾葘⑹挛锏膶傩院凸δ芊庋b在對象中重挑,再按需使用對象的屬性和方法。

如何: 3種:

  1. 直接量:
    var obj={
    屬性名:值,
    ... : ... ,
    方法名(){
    ... this.屬性名 ...
    }
    }
    問題: 對象自己的方法棠涮,要使用自己的屬性值谬哀,缺找不到!
    原因: 不加.訪問的變量严肪,只能在作用域鏈中查找史煎,無法自動進入對象中查找
    解決: 錯誤: 在屬性前加"對象."
    在對象內(nèi),禁止寫死對象名
    因為對象名其實僅是一個普通變量名驳糯,很有可能發(fā)生變化
    正確: 用this.屬性名:
    this: 在函數(shù)執(zhí)行時篇梭,自動創(chuàng)建的一個關(guān)鍵詞
    自動指向正在調(diào)用當(dāng)前函數(shù)的.前的對象
    為什么: 不受對象名的影響
    總結(jié): 今后,只要對象自己的方法酝枢,想訪問自己的屬性恬偷,必須用this.屬性名
var lilei=/*new */Object();
       lilei.sname="Li Lei";
       lilei.age=11;
       lilei.intr=function(){
           console.log(
                   "I'm "+this.sname
                   +", I'm "+this.age
           );
       }

       console.dir(lilei);//顯示一個對象的存儲結(jié)構(gòu)
       console.log(lilei.sname);
       console.log(lilei.age);
       lilei.intr();//this->lilei
       lilei.age++;
       console.log(lilei.age);
       lilei.intr();
       lilei.sname="Li Xiaolei";
       lilei.intr();
  1. 用new: 2步:
  1. 先創(chuàng)建一個空對象
    var obj=new Object(); //new可省略,()也可省略,但不能同時省
  2. 向空對象中添加新成員:
    obj.屬性名=值;
    obj.方法名=function(){ ... this.屬性名 ... }
    說明: js中的對象,可隨時帘睦,通過強行賦值的方式袍患,添加新成員
    何時: 如果在創(chuàng)建對象時,暫時不知道對象的成員

揭示: js中的對象竣付,底層其實就是關(guān)聯(lián)數(shù)組

  相同: 1. 都可用.或[]隨時添加/訪問成員
       2. 訪問不存在的成員诡延,不報錯,返回undefined
       3. 都可用for in遍歷每個成員
  不同: 對象比關(guān)聯(lián)數(shù)組用法簡單卑笨!

今后孕暇,都是用對象來代替關(guān)聯(lián)數(shù)組使用!

console.dir():xianshi

問題: 一次只能創(chuàng)建一個對象
如果反復(fù)創(chuàng)建相同結(jié)構(gòu)的多個對象赤兴,重復(fù)代碼會很多
解決:構(gòu)造函數(shù)

//DRY
        //1. 定義構(gòu)造函數(shù)妖滔,描述學(xué)生類型的統(tǒng)一結(jié)構(gòu)
        function Student(sname,age){
            this.sname=sname;
            this.age=age;
            this.intr=function(){
                console.log(
                    "I'm "+this.sname
                    +", I'm "+this.age);
            }
        }
        //2. 用new調(diào)用構(gòu)造函數(shù)反復(fù)創(chuàng)建學(xué)生類型的具體對象
        var lilei=new Student("Li Lei",11);
        var hmm=new Student("Han Meimei",12);
        console.dir(lilei);
        console.dir(hmm);
        lilei.intr();
        hmm.intr();
  1. 用構(gòu)造函數(shù)(constructor):
    什么是: 描述同一類型的多個對象,相同成員結(jié)構(gòu)的函數(shù)
    第二個作用: 將一個空對象構(gòu)造為擁有屬性和功能的完整對象
    何時: 只要反復(fù)創(chuàng)建同一類型的多個對象時桶良,都要先用構(gòu)造函數(shù)描述統(tǒng)一的結(jié)構(gòu)座舍,再用構(gòu)造函數(shù)創(chuàng)建對象
    如何: 2步
1. 定義構(gòu)造函數(shù): 
  function 類型名(屬性參數(shù),....){
    this.屬性名=屬性參數(shù);
       ... = ... ;
    this.方法名=function(){
      ... this.屬性名 ...
    }
  }
2. 使用構(gòu)造函數(shù)反復(fù)創(chuàng)建對象: 
  var obj= new類型名(屬性值,...);
 調(diào)用時的參數(shù)值,應(yīng)和定義構(gòu)造函數(shù)時的屬性參數(shù)保持一致陨帆。
 new: 4件事: 
 1. 創(chuàng)建一個新的空對象
 2. 自動讓新的子對象繼承構(gòu)造函數(shù)的原型對象
 3. 調(diào)用構(gòu)造函數(shù)曲秉,將構(gòu)造函數(shù)中的this執(zhí)行正在創(chuàng)建的新對象。向新的空對象中強行添加新成員
 4. 將新對象地址返回給變量保存

優(yōu): 重用結(jié)構(gòu)定義
缺: 浪費內(nèi)存

構(gòu)造函數(shù)ex:
function Student(sname,age){
        this.sname=sname;
        this.age=age;
        this.intr=function(){
            console.log("我是"+this.sname+",我今年"+this.age);
        }
    }
    var lilei=new Student("Li lei","18");
    console.log(lilei);
    lilei.intr();
    var Hanmeimei=new Student("Hanmeimei","21");
    Hanmeimei.intr();

繼承:

什么是: 父對象的成員疲牵,子對象無需創(chuàng)建即可直接使用承二!
為什么: 代碼重用!節(jié)約內(nèi)存纲爸!
何時: 所有子對象都擁有相同的屬性值和方法定義時亥鸠,都要用繼承來實現(xiàn)
如何: js中所有繼承,都是繼承原型對象

什么是原型對象: 集中存儲所有子對象共有成員的父對象
為什么: 實現(xiàn)繼承
何時: 只要實現(xiàn)繼承,都要繼承原型對象
如何:
創(chuàng)建: 不用手動創(chuàng)建负蚊,買一贈一
其實創(chuàng)建構(gòu)造函數(shù)同時神妹,都附贈一個空的原型對象

繼承: 不用手動設(shè)置

用new創(chuàng)建新的子對象時,會自動設(shè)置新對象繼承構(gòu)造函數(shù)的原型對象

添加共有成員: 

  構(gòu)造函數(shù).prototype.成員=值;

總結(jié): 只要所有子對象共用的成員家妆,都必須集中存儲在原型對象中


自有屬性和共有屬性:

自有屬性: 直接保存在對象本地的屬性

共有屬性: 保存在原型對象中鸵荠,所有子對象共有的屬性

讀取: 兩者完全一樣: 對象.屬性名

修改: 自有屬性: 只能用子對象改: 子對象.自有屬性名=值

自有、共有屬性修改時的差別:I思S颊摇!
lilei.sname="li xiaolei"
Student.prototype.className="初二";

共有屬性: 只能用原型對象修改:

                        構(gòu)造函數(shù).prototype.共有屬性名=值

原型鏈: prototype chain

什么是: 由多級父對象塑荒,逐級繼承熄赡,形成的鏈式結(jié)構(gòu)

為什么: 為了更高級,更大范圍的重用

如何:

所有對象,都有__proto__屬性

原型對象的__proto__指向更上級的父對象

所有對象最終都繼承自O(shè)bject.prototype——頂級父對象

內(nèi)置對象的原型鏈:

其實每種內(nèi)置類型都有對應(yīng)的構(gòu)造函數(shù)和原型對象齿税,也最終都繼承自O(shè)bject.prototype

其中: 內(nèi)置類型的構(gòu)造函數(shù)負責(zé)創(chuàng)建該類型的子對象

內(nèi)置類型的原型對象負責(zé)保存該類型所有子對象共有的API

問題: 舊瀏覽器不支持新的API

解決: 向舊瀏覽器中的原型對象中手動添加一個函數(shù)

鄙視: 判斷一個對象是不是數(shù)組類型彼硫,有幾種方法:

typeof不行!

  1. 判斷原型對象:
Object.getPrototypeOf(obj)==Array.prototype   

      判斷obj是數(shù)組類型的子對象

 問題: __proto__是內(nèi)部屬性凌箕,本不應(yīng)該被訪問到

 解決: 用Object.getPrototypeOf(obj)

代替proto

  1. 判斷構(gòu)造函數(shù):

實例

obj instanceof Array

判斷obj是不是被構(gòu)造函數(shù)Array創(chuàng)造出來的

instanceof 不僅判斷直接父類型拧篮,而是所有在原型鏈上的類型,都返回true牵舱!

  1. 判斷對象的內(nèi)部class屬性
每個對象內(nèi)部串绩,都有一個隱藏的class屬性,記錄該對象創(chuàng)建時的數(shù)據(jù)類型

class屬性不會隨繼承關(guān)系的改變而改變

問題1: class是內(nèi)部屬性

解決: 只有最頂層的toString()才能輸出對象的class屬性值

[object class名]

問題2: 內(nèi)置類型的原型對象中幾乎都重寫了新的toString()

解決: 用call強行調(diào)用: 

call: 讓一個對象芜壁,調(diào)用一個本來無法調(diào)用到的函數(shù)

何時: 只要希望調(diào)用一個本無法調(diào)用到的函數(shù)

如何: 要調(diào)用的函數(shù).call(對象)

Object.prototype.toString.call(obj)=="[object Array]"

說明obj的內(nèi)部屬性class的值為"Array"

  1. 多態(tài):

什么是: 同一個函數(shù)在不同情況下表現(xiàn)出不同的狀態(tài)

重寫: 如果子對象覺得父對象的成員不好用礁凡,可在本地定義同名成員,覆蓋父對象中繼承來的成員

為什么: 體現(xiàn)子對象和父對象之間的差異

何時: 只要子對象覺得父對象的成員不好用慧妄,就可以重寫顷牌!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市塞淹,隨后出現(xiàn)的幾起案子窟蓝,更是在濱河造成了極大的恐慌,老刑警劉巖饱普,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运挫,死亡現(xiàn)場離奇詭異,居然都是意外死亡套耕,警方通過查閱死者的電腦和手機谁帕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯袍,“玉大人雇卷,你說我怎么就攤上這事。” “怎么了关划?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翘瓮。 經(jīng)常有香客問我贮折,道長,這世上最難降的妖魔是什么资盅? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任调榄,我火速辦了婚禮,結(jié)果婚禮上呵扛,老公的妹妹穿的比我還像新娘每庆。我一直安慰自己,他們只是感情好今穿,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布缤灵。 她就那樣靜靜地躺著,像睡著了一般蓝晒。 火紅的嫁衣襯著肌膚如雪腮出。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天芝薇,我揣著相機與錄音胚嘲,去河邊找鬼。 笑死洛二,一個胖子當(dāng)著我的面吹牛馋劈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晾嘶,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妓雾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了变擒?” 一聲冷哼從身側(cè)響起君珠,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娇斑,沒想到半個月后策添,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡毫缆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年唯竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苦丁。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浸颓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情产上,我是刑警寧澤棵磷,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晋涣,受9級特大地震影響仪媒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谢鹊,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一算吩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佃扼,春花似錦偎巢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翠订,卻和暖如春巢音,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尽超。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工官撼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人似谁。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓傲绣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巩踏。 傳聞我的和親對象是個殘疾皇子秃诵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 1.1面向?qū)ο?面向?qū)ο?object-oriented ;簡稱: OO)至今還沒有統(tǒng)一的概念 我這里把它定義為:...
    TENG書閱讀 567評論 0 0
  • 面向?qū)ο缶幊蹋琽op并不是針對與javascript塞琼,很多語言都實現(xiàn)了oop這樣一個編程發(fā)法論菠净,比如說java,c...
    深沉的簡單閱讀 431評論 0 3
  • 我想做朵云 作者:鳳梨 (時間管理踐行者彪杉,人力資源從業(yè)者) 如果有下輩子的話 我希望自己變成一朵云 自由自在的在天...
    鳳梨_2017閱讀 350評論 0 2
  • 那一年的高考毅往,改變了曾經(jīng)的我們……現(xiàn)在的你們,可還都還好嗎派近!
    單老師閱讀 189評論 0 0