成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

理解JS非構(gòu)造函數(shù)繼承

Cristic / 2609人閱讀

摘要:即對象為非構(gòu)造函數(shù),普通函數(shù)繼承另一個普通函數(shù)。方法淺拷貝深拷貝推薦方法發(fā)明人,提出的函數(shù)。該函數(shù)就是把子對象的屬性,指向父對象。

即對象為非構(gòu)造函數(shù),普通函數(shù)繼承另一個普通函數(shù)。

object()方法

淺拷貝

深拷貝(推薦)

object()方法

json發(fā)明人Douglas Crockford,提出的object()函數(shù)。

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

該函數(shù)就是把子對象的prototype屬性,指向父對象。使用時依然是先繼承后定義子對象的方法和屬性

var parent = {
    name: "Oliver"
};
var child = object(parent); //先繼承
child.age = 18; //后定義
console.log(child.name); //Oliver
console.log(child.age); //18

淺拷貝

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

該方法只能繼承基本數(shù)據(jù)類型,如果父對象有數(shù)組等對象,拷貝的只是個地址,子對象屬性的改變會導(dǎo)致父對象屬性的改變(篡改問題)

var parent = {
    name: "Oliver",
    friend: [1,2,3]
};

var child = extend(parent); //先繼承
child.age = 18;

console.log(child.name); //Oliver
console.log(child.age); //18
child.friend.pop();
console.log(child.friend); //兩者都改變了
console.log(parent.friend); //兩者都改變了

深拷貝

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;  
}

該方法原理是遞歸調(diào)用"淺拷貝"

var parent = {
    name: "Oliver",
    friend: [1, 2, 3]
};

var child = deepCopy(parent); //先繼承
child.age = 18;

console.log(child.name); //Oliver
console.log(child.age); //18
child.friend.pop();
console.log(child.friend); //[1, 2]
console.log(parent.friend); //[1, 2, 3]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/79164.html

相關(guān)文章

  • 面向?qū)ο蟮?JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風格,導(dǎo)致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0
  • 獨家解析Javascript原型繼承

    摘要:面向?qū)ο髮崿F(xiàn)代碼動物發(fā)聲汪汪喵喵調(diào)用代碼動物發(fā)聲喵喵動物發(fā)聲汪汪當要增加一種動物時,只需增加一個繼承,不會影響其他已有的動物邏輯。所以的繼承和的原型繼承,可謂殊途同歸。 傳統(tǒng)面向?qū)ο蟮睦^承和多態(tài) 我們知道C++/Java/C#等面向?qū)ο笳Z言,都原生地支持類的繼承。繼承的核心作用大抵是創(chuàng)建一個派生類,并使其復(fù)用基本類(即父類)的字段和/或方法。并且派生類可以重寫基本類的方法。這樣基本類和...

    verano 評論0 收藏0
  • JS對象繼承與原型鏈

    摘要:此用來定義通過構(gòu)造器構(gòu)造出來的對象的原型,構(gòu)造器內(nèi)部的代碼用來給對象初始化。 對象繼承 VS 類繼承 在 class-based 的面向?qū)ο蟮氖澜缋?,要出現(xiàn)對象,必須先有類。類之間可以繼承,類再使用 new 操作創(chuàng)建出實體,父子對象之間的繼承體現(xiàn)在父類和子類上。你不能說 對象 a 繼承了對象 b,只能說 class A 繼承了 class B,然后他們各自有一個實例a、b。 JS中實現(xiàn)...

    QLQ 評論0 收藏0
  • JavaScript之深入各種繼承

    摘要:通常有這兩種繼承方式接口繼承和實現(xiàn)繼承。理解繼承的工作是通過調(diào)用函數(shù)實現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強工作。適用基于某個對象或某些信息來創(chuàng)建對象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z言的一個重要概念。通常有這兩種繼承方式:接口繼承和實現(xiàn)繼承。接口繼承只繼承方法簽名,而實現(xiàn)繼承則繼承實際的方法。 《JS高程》里提到:由于函數(shù)沒有簽名,...

    tomlingtm 評論0 收藏0
  • JS繼承方式總結(jié)

    摘要:三組合繼承結(jié)合原型鏈方式和借用構(gòu)造函數(shù)方式的有點,進行改進的一種繼承方式。四寄生組合式繼承為了解決組合繼承中子構(gòu)造函數(shù)的原型鏈出現(xiàn)冗余的屬性和方法,引入的一種繼承方式。 說在前面:為了使代碼更為簡潔方便理解, 本文中的代碼均將非核心實現(xiàn)部分的代碼移出。 一、原型鏈方式關(guān)于原型鏈,可點擊《深入淺出,JS原型鏈的工作原理》,本文不再重復(fù)敘述。 思路:讓子構(gòu)造函數(shù)的原型等于父構(gòu)造函數(shù)的實例...

    rottengeek 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<