1

我不是非常好,Javascript繼承aquainted,我試圖使一個物體從另一個繼承,並定義自己的方法Javascript繼承覆蓋第一個(FooB.prototype = new Foo() is cancelled out)。有什麼辦法可以解決這個問題,還是我的方向不對?從多個對象

在此先感謝,對於任何不好的術語感到抱歉。

回答

5

每個對象只能有一個原型,所以如果你想在繼承(複製)它後添加到原型,你必須擴展它而不是分配一個新的原型。例如:

function Foo() {} 

Foo.prototype = { 
    x: function(){ alert('x'); }, 
    y: function(){ alert('y'); } 
}; 

function Foo2() {} 

Foo2.prototype = new Foo(); 
Foo2.prototype.z = function() { alert('z'); }; 

var a = new Foo(); 
a.x(); 
a.y(); 
var b = new Foo2(); 
b.x(); 
b.y(); 
b.z(); 
+0

有沒有辦法用另一個對象擴展原型,而不覆蓋它? – tcooc 2011-01-20 11:50:56

2

一個解決辦法是:

function FooB() {} 
var p = new Foo(); 
p.methodA = function(){...} 
p.methodB = function(){...} 
p.methodC = function(){...} 
... 

FooB.prototype = p; 

更新:關於與現有對象擴大。您可以隨時一個對象的現有屬性複製到另一個問題:只要proto是一個「普通」對象

FooB.prototype = new Foo(); 
var proto = { 
    /*...*/ 
}; 

for(var prop in proto) { 
    FooB.prototype[prop] = proto[prop]; 
} 

(即不從另一個對象繼承),它是好的。否則,您可能需要添加if(proto.hasOwnProperty(prop))以僅添加非繼承屬性。

+0

`proto`可以是一個 「普通」 的對象,但如果第三方腳本增強`Object.prototype`你最終會複製這些值`FooB。 prototype`。 – galambalazs 2011-01-20 12:39:43

2

您可以使用extend功能,拷貝新成員原型對象。

function FooB() {} 
FooB.prototype = new FooA(); 

extend(FooB.prototype, { 
    /* other methods here */ 
}); 

延長

/** 
* Copies members from an object to another object. 
* @param {Object} target the object to be copied onto 
* @param {Object} source the object to copy from 
* @param {Boolean} deep whether the copy is deep or shallow 
*/ 
function extend(target, source, deep) { 
    for (var i in source) { 
     if (deep || Object.hasOwnProperty.call(source, i)) { 
      target[i] = source[i]; 
     } 
    } 
    return target; 
}