我不是非常好,Javascript繼承aquainted,我試圖使一個物體從另一個繼承,並定義自己的方法Javascript繼承覆蓋第一個(FooB.prototype = new Foo() is cancelled out
)。有什麼辦法可以解決這個問題,還是我的方向不對?從多個對象
在此先感謝,對於任何不好的術語感到抱歉。
我不是非常好,Javascript繼承aquainted,我試圖使一個物體從另一個繼承,並定義自己的方法Javascript繼承覆蓋第一個(FooB.prototype = new Foo() is cancelled out
)。有什麼辦法可以解決這個問題,還是我的方向不對?從多個對象
在此先感謝,對於任何不好的術語感到抱歉。
每個對象只能有一個原型,所以如果你想在繼承(複製)它後添加到原型,你必須擴展它而不是分配一個新的原型。例如:
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();
一個解決辦法是:
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))
以僅添加非繼承屬性。
`proto`可以是一個 「普通」 的對象,但如果第三方腳本增強`Object.prototype`你最終會複製這些值`FooB。 prototype`。 – galambalazs 2011-01-20 12:39:43
您可以使用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;
}
有沒有辦法用另一個對象擴展原型,而不覆蓋它? – tcooc 2011-01-20 11:50:56