面向對象的JavaScript 六 ---- javascript 繼承方式總結

文本主要對與12種繼承的實現方式進行總結:

1.prototype chaining
Child。prototype = new Parent();
ECMA標準默認描述的機制,將所有的屬性和方法被子類繼承。

2.Inherit only the prototype
Child.prototype = Parent.prototype;
共享prototype對象,因爲不必創建新的實例,導致效率更高.由於不是鏈式結構,所以查找繼承方法和屬性時更快.缺點是,子類可以修改父類的功能.

3.Temporaty constructor
function extend(Child,Parent)
{
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype =new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}

與第一種繼承方式不同,這種繼承方式只是繼承prototype屬性,在構造函數中定義的屬性不會被繼承.這種防護四用在YUI和Ext.js中.

4. Copying the prototype properties
funciton extends(Child, Parent)
{
    var p = Parent.prototype;
    var c = Child.prototype;
    for (var i in p)
    {
        c[i] = p[i];
    }
    c.uber = p;
}

通過拷貝prototype屬性實現繼承,不需要建立爲了繼承而構建對象,同時縮短了prototype鏈.

5.Copy all properties(shallow copy)
function extendCopy(p)
{
    var c={};
    for (var i in p)
    {
        c[i] = p[i];
    }
    c.uber=p;
    return c;
}

用過拷貝對象的屬性實現繼承,實現簡單,早期的jQuery和prototype.js使用這種方法實現及策劃那個.

6.Deep Copy
代碼類似上一個方法,只是會用遞歸調用的方法來複制對象裏的所用屬性。現在的jQuery中使用這種方法實現繼承。

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

8.Extend and Augment
function objectPlus(o,stuff)
{
    var n;
    function F(){};
    f.prototype = o;
    n = new F();
    n.uber = o;
    for (var i in stuff)
    {
        n[i] = stuff[i];
    }
    return n;
}
#7和#5的混合

9.Multiple inheritance
function multi()
{
    var n ={};
    var stuff;
    var j=0;
    var len = arguments.length;
    for (j=0;j<len;j++)
    {
        stuff = arguments[j];
        for (var i in stuff)
        {
            n[i] = stuff[i];
        }
    }
    return n;
}
這個方法可以實現多重繼承

10.Parasitic inheritancs
function parasite(victim)
{
    var that = object(victim);
    that.more=1;
    return that;
}

11 Borrowing constructors
function Child()
{
    Parent.apply(this,augument);
}
改方法可以和#1結合可以很好的解決繼承時,只是得到了父類屬性引用的問題。

12 Borrow & Copy
function Child()
{
    Parent.apply(this,arguents);
}
extend2(Child,Parent);
結合#11和#4便面調用兩次父類的構造函數。

終於介紹完了javascript中的所有繼承的知識,之後的文章。我會介紹javascript中的一些設計模式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章