關(guān)于繼承

繼承的實現(xiàn)方法

  • 屬性拷貝
  • 淺拷貝
  • 深拷貝
  • 原型繼承
  • 原型式繼承
  • 原型鏈繼承
  • 組合繼承(深拷貝+優(yōu)化后的原型式繼承)

1. 屬性拷貝

  • 直接賦值和屬性拷貝
  • 直接賦值
     var obj1 = {name:'aa',...};
     var obj2 = obj1;
    
  • 屬性拷貝
     var obj1 = {name:'aa',...};
     var obj2 = {};
     for(var i in obj1){
            obj2[i] = obj1[i];
     }
    
  • 兩種方式的區(qū)別及不足
  • 直接賦值:
    • 所有數(shù)據(jù)共享
    • 重新設(shè)置某個對象的引用類型值時,其余對象受影響
  • 屬性拷貝:
    • 引用類型是共享的
    • 重新設(shè)置某個對象的引用類型值時,其余的對象不會受影響今布。


      屬性拷貝.png

2. 原型式繼承

  • 利用動態(tài)特性
  • 直接替換原型對象
  • 設(shè)置子構(gòu)造函數(shù)的原型對象 = 父構(gòu)造函數(shù)的原型對象

注意點(不足):

  1. 原型對象父子共享
  2. 子構(gòu)造函數(shù)創(chuàng)建的對象的構(gòu)造器屬性不正確(和父構(gòu)造函數(shù)原型對象的構(gòu)造屬性相同啄踊。)
  3. 無法獲取父構(gòu)造函數(shù)實例對象上的屬性和方法(只能獲得父構(gòu)造函數(shù)原型對象上的屬性和方法。)


    原型式繼承.png

3. 原型鏈繼承

子構(gòu)造函數(shù).prototype = new 父構(gòu)造函數(shù)();
原型鏈繼承.png

延伸

  1. 每個對象都是由構(gòu)造函數(shù)創(chuàng)建出來的
  2. 每個構(gòu)造函數(shù)都有一個與之相關(guān)連的原型對象(prototype)
  3. 構(gòu)造函數(shù)的原型對象本身也是對象颠毙,因此構(gòu)造函數(shù)的原型對象也有自己的構(gòu)造函數(shù)
  4. 構(gòu)造函數(shù)的原型對象的構(gòu)造函數(shù)也有相關(guān)聯(lián)的原型對象民傻,而這個原型對象也是一個對象言秸,因此也有構(gòu)造函數(shù)
  5. 構(gòu)造函數(shù)的原型對象的構(gòu)造函數(shù)的原型對象也有構(gòu)造函數(shù)..也有原型對象..也是對象...構(gòu)造函數(shù)....
    以上 會形成一種鏈?zhǔn)降脑L問結(jié)構(gòu),這種結(jié)構(gòu)稱為原型鏈

原型鏈的終點是Object.prototype 扳缕,Object.prototype的原型對象是null(Object.prototype.proto == null)所有對象原型鏈的終點都是Object.prototype

3.1 原型鏈中屬性的搜索規(guī)則:

  • 對象在訪問(讀取|寫)屬性的時候,先遍歷當(dāng)前的對象查找自身有沒有指定的屬性
  • 如果有該屬性慌闭,那么就直接使用
  • 如果沒有該屬性,那么就遍歷當(dāng)前對象的原型對象躯舔,在原型對象身上查詢指定的屬性
    • 找到那么就直接使用
    • 沒有找到驴剔,那么就繼續(xù)向上查詢
  • 重復(fù)這個過程,直到Object.prototype,如果找到那么就使用粥庄,如果沒有找到那么就返回undefined或者是報錯

注意點:

  1. 要注意設(shè)置原型鏈繼承的位置:先完成原型鏈繼承丧失,再給原型對象添加成員
子構(gòu)造函數(shù).prototype = new 父構(gòu)造函數(shù)();
  1. 完成原型鏈繼承之后最好修正構(gòu)造器屬性
子構(gòu)造函數(shù).prototype.contructor = 父構(gòu)造函數(shù)名;
  1. 完成原型鏈繼承之后,不能使用字面量的方式來替換原型對象(繼承會失效)

不足:

  1. 父構(gòu)造函數(shù)實例成員(屬性+方法)會成為子購造函數(shù)創(chuàng)建對象的原型成員惜互,有共享的問題
  2. 無法對父構(gòu)造函數(shù)傳遞

4. 組合繼承(優(yōu)化前)

  • 借用構(gòu)造函數(shù) + 原型式繼承
//父構(gòu)造函數(shù)
function Person(name,age){
      this.name = name;
      this.age = age;
}
Person.prototype.logName=function(){
        console.log(this.name);
}
//子構(gòu)造函數(shù)
function Children(name,age){
        //構(gòu)造函數(shù)內(nèi)部會默認(rèn)創(chuàng)建空對象并賦值給this
        Person.call(this,name,age); //相當(dāng)于this.name = name;this.age = age;(借用構(gòu)造函數(shù))
}
//原型式繼承
Children.prototype = Person.prototype;
//創(chuàng)建實例對象
var child = new Children("小明",18);

不足:原型對象共享問題布讹。

5. 深拷貝

  • 淺拷貝:for...in循環(huán)直接拷貝(引用類型屬性共享問題)
  • 深拷貝:
  • 使用for...in遍歷被拷貝的對象。
    • 如果是值類型训堆,直接賦值
    • 如果是引用類型描验,新創(chuàng)建一個對象,再次遍歷...重復(fù)此過程
function deepCopy(obj1,obj2){
        for(var i in obj1){
            //只拷貝對象自身的屬性和方法坑鱼,不拷貝其原型對象中的屬性和方法
            if(obj1.hasOwnProperty(i)){
                 //當(dāng)為引用類型時膘流,繼續(xù)遍歷-拷貝
                if(typeof obj1[i] == 'object'){
                   //區(qū)分?jǐn)?shù)組類型和object類型
                    obj2[i] = Array.isArray() ? [] : {};
                    //遞歸
                    deepCopy(obj1[i],obj2[i]);
                } else {
                    obj2[i] = obj1[i];
                }
            }
        }
    }

6. 通過深拷貝實現(xiàn)繼承(組合繼承優(yōu)化后)

//父構(gòu)造函數(shù)
function Person(name,age){
      this.name = name;
      this.age = age;
}
Person.prototype.logName=function(){
        console.log(this.name);
}
//子構(gòu)造函數(shù)
function Children(name,age){
        //構(gòu)造函數(shù)內(nèi)部會默認(rèn)創(chuàng)建空對象并賦值給this
        Person.call(this,name,age); //相當(dāng)于this.name = name;this.age = age;(借用構(gòu)造函數(shù))
}
//深拷貝
deepCopy(Person.prototype,Children.prototype);
//創(chuàng)建實例對象
var child = new Children("小明",18);

Object方法

  1. Object.create()方法
  • 作用:創(chuàng)建對象并設(shè)置為原型對象
  • 用法:
var o = Object.create(obj);
//相當(dāng)于:創(chuàng)建一個空對象o,并且設(shè)置這個對象的原型對象為obj
  • 注意兼容性處理鲁沥。
var o;
    if(typeof Object.create == "function") {
         o = Object.create(obj);
    }else {
        Object.create = function () {
            function F() {};
            F.prototype = obj;
            o = new F();
        }
    }
  1. Object.assign()方法
  • 作用:拷貝屬性呼股,一次性拷貝多個對象的屬性。
  • 用法:
Object.assign(目標(biāo)對象画恰,要拷貝屬性的對象1彭谁,要拷貝屬性的對象2,要拷貝屬性的對象3)
  • 注意點:
    • 新特性有兼容性問題
    • 默認(rèn)原型(.proto)成員不能拷貝

3.call和apply函數(shù)

  • 來源:所有的對象方法都擁有這兩個函數(shù)(方法),這兩個方法寫在Function.prototype上面
  • 作用:借用其他對象的方法
  • 用法:
對象1.方法.call(借用者對象,參數(shù)1允扇,參數(shù)2缠局,參數(shù)3...)   //方法內(nèi)部的this會綁定給call的第一個參數(shù)
    對象1.方法.apply(借用者對象,[參數(shù)1则奥,參數(shù)2,參數(shù)3...])
  • 兩個函數(shù)的區(qū)別(傳遞參數(shù)):
    • 傳遞參數(shù)不同
    • 期望的形參長度不同(函數(shù).length 形參的個數(shù))
      • call:length 1 期望傳遞一個參數(shù)
      • apply:length 2 期望傳遞兩個參數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甩鳄,一起剝皮案震驚了整個濱河市逞度,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妙啃,老刑警劉巖档泽,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揖赴,居然都是意外死亡馆匿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門燥滑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渐北,“玉大人,你說我怎么就攤上這事铭拧≡咧耄” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵搀菩,是天一觀的道長呕臂。 經(jīng)常有香客問我,道長肪跋,這世上最難降的妖魔是什么歧蒋? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮州既,結(jié)果婚禮上谜洽,老公的妹妹穿的比我還像新娘。我一直安慰自己吴叶,他們只是感情好阐虚,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚌卤,像睡著了一般敌呈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上造寝,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音吭练,去河邊找鬼诫龙。 笑死,一個胖子當(dāng)著我的面吹牛鲫咽,可吹牛的內(nèi)容都是我干的签赃。 我是一名探鬼主播谷异,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锦聊!你這毒婦竟也來了歹嘹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孔庭,失蹤者是張志新(化名)和其女友劉穎尺上,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圆到,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡怎抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芽淡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片马绝。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挣菲,靈堂內(nèi)的尸體忽然破棺而出富稻,到底是詐尸還是另有隱情,我是刑警寧澤白胀,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布椭赋,位于F島的核電站,受9級特大地震影響纹笼,放射性物質(zhì)發(fā)生泄漏纹份。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一廷痘、第九天 我趴在偏房一處隱蔽的房頂上張望蔓涧。 院中可真熱鬧,春花似錦笋额、人聲如沸元暴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茉盏。三九已至,卻和暖如春枢冤,著一層夾襖步出監(jiān)牢的瞬間鸠姨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工淹真, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讶迁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓核蘸,卻偏偏與公主長得像巍糯,于是被迫代替她去往敵國和親荣德。 傳聞我的和親對象是個殘疾皇子触机,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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