JavaScript非構造函數(shù)的繼承

一席里、什么是"非構造函數(shù)"的繼承梧躺?

比如,現(xiàn)在有一個對象亏吝,叫做"中國人"店诗。

var Chinese = {
    nation:'中國'
};

還有一個對象裹刮,叫做"醫(yī)生"。

var Doctor ={
    career:'醫(yī)生'
}

要怎樣才能讓"醫(yī)生"去繼承"中國人"庞瘸?

這里兩個對象都是普通對象捧弃,而非構造函數(shù),無法用構造函數(shù)方法實現(xiàn)"繼承"擦囊。

二违霞、object()方法

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

這里的object()函數(shù),就是把子對象的prototype屬性瞬场,指向父對象买鸽,從而使得子對象與父對象連在一起。

使用時贯被,先在父對象的基礎上眼五,生成子對象:

var Doctor = object(Chinese);

然后,再加上子對象本身的屬性:

Doctor.career = '醫(yī)生';

這時彤灶,子對象已繼承了父對象的屬性看幼。

alert(Doctor.nation);    //中國

三、淺拷貝

把父對象的屬性幌陕,全部拷貝給子對象桌吃,也能實現(xiàn)繼承。

下面這個函數(shù)苞轿,就是在做拷貝:

function extendCopy(p) {
    var c = {};
    for (var i in p) { 
        c[i] = p[i];
    }
    c.uber = p;
    return c;
}

使用的這樣寫:

var Doctor = extendCopy(Chinese);
Doctor.career = '醫(yī)生';
alert(Doctor.nation);    // 中國

但是茅诱,這樣拷貝有個問題:如果父對象的屬性等于數(shù)組或另一個對象,那么實際上搬卒,子對象獲得的只是一個內存地址瑟俭,而非真正拷貝,因此存在父對象被篡改的可能契邀。

現(xiàn)在給Chinese添加一個"出生地"屬性摆寄,它的值是一個數(shù)組。

Chinese.birthPlaces = ['北京','上海','廣州'];

通過extendCopy()函數(shù)坯门,Doctor繼承了Chinese微饥。

var Doctor = extendCopy(Chinese);

然后,我們?yōu)镈octor的"出生地"添加一個城市:

Doctor.birthPlaces.push('深圳');

此時古戴,Chinese的"出生地"也被修改了欠橘?

alert(Doctor.birthPlaces);    //北京, 上海, 廣州, 深圳
alert(Chinese.birthPlaces);    //北京, 上海, 廣州, 深圳

所以,extendCopy()只是拷貝基本類型的數(shù)據(jù)现恼,我們把這種拷貝叫做"淺拷貝"肃续。這是早期jQuery實現(xiàn)繼承的方式。

四叉袍、深拷貝

所謂"深拷貝"始锚,就是能夠實現(xiàn)真正意義上的數(shù)組和對象的拷貝。它的實現(xiàn)并不難喳逛,只要遞歸調用"淺拷貝"就行了瞧捌。

function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
        if (typeof p[i] === 'object') {
            c[i] = (p[i].constructor === Array) ? [] : {};
            deepCopy(p[i], c[i]);
        }
        else {
            c[i] = p[i];
        }
    }
    return c;
}

使用時這樣寫:

var Doctor = deepCopy(Chinese);

現(xiàn)在,給父對象加一個屬性润文,值為數(shù)組姐呐。然后,在子對象上修改這個屬性:

Chinese.birthPlaces = ['北京','上海','廣州'];
Doctor.birthPlaces.push('深圳');

這時转唉,父對象就不會受到影響了皮钠。

alert(Doctor.birthPlaces);    //北京, 上海, 廣州, 深圳
alert(Chinese.birthPlaces);    //北京, 上海, 廣州

目前,jQuery庫使用的就是這種繼承方法赠法。

至于構造函數(shù)的繼承麦轰,請參考http://www.reibang.com/p/96bdc8563155

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砖织,隨后出現(xiàn)的幾起案子款侵,更是在濱河造成了極大的恐慌,老刑警劉巖侧纯,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件新锈,死亡現(xiàn)場離奇詭異,居然都是意外死亡眶熬,警方通過查閱死者的電腦和手機妹笆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門块请,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拳缠,你說我怎么就攤上這事墩新。” “怎么了窟坐?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵海渊,是天一觀的道長。 經常有香客問我哲鸳,道長臣疑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任徙菠,我火速辦了婚禮讯沈,結果婚禮上,老公的妹妹穿的比我還像新娘懒豹。我一直安慰自己芙盘,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布脸秽。 她就那樣靜靜地躺著儒老,像睡著了一般。 火紅的嫁衣襯著肌膚如雪记餐。 梳的紋絲不亂的頭發(fā)上驮樊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音片酝,去河邊找鬼囚衔。 笑死,一個胖子當著我的面吹牛雕沿,可吹牛的內容都是我干的练湿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼审轮,長吁一口氣:“原來是場噩夢啊……” “哼肥哎!你這毒婦竟也來了?” 一聲冷哼從身側響起疾渣,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤篡诽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榴捡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杈女,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了达椰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰蠢。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砰碴,靈堂內的尸體忽然破棺而出躏筏,到底是詐尸還是另有隱情,我是刑警寧澤呈枉,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站埃碱,受9級特大地震影響猖辫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜砚殿,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一啃憎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧似炎,春花似錦辛萍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仆嗦,卻和暖如春辉阶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘩扼。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工谆甜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人集绰。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓规辱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栽燕。 傳聞我的和親對象是個殘疾皇子罕袋,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容