来自多个对象的javascript继承
我不太熟悉javascript继承,我试图让一个对象从另一个对象继承,并定义它自己的方法:来自多个对象的javascript继承,javascript,oop,multiple-inheritance,prototypal-inheritance,Javascript,Oop,Multiple Inheritance,Prototypal Inheritance,我不太熟悉javascript继承,我试图让一个对象从另一个对象继承,并定义它自己的方法: function Foo() {} Foo.prototype = { getColor: function () {return this.color;}, }; function FooB() {} FooB.prototype = new Foo(); FooB.prototype = { /* other methods here */ }; var x = new FooB()
function Foo() {}
Foo.prototype = {
getColor: function () {return this.color;},
};
function FooB() {}
FooB.prototype = new Foo();
FooB.prototype = {
/* other methods here */
};
var x = new FooB().getColor();
但是,第二个将覆盖第一个(FooB.prototype=new Foo()被取消)。有没有办法解决这个问题,还是我走错了方向
提前感谢,对于任何不好的术语,我深表歉意。一个解决方案是:
function FooB() {}
var p = new Foo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...
FooB.prototype = p;
更新:关于使用现有对象展开。始终可以将一个对象的现有特性复制到另一个对象:
FooB.prototype = new Foo();
var proto = {
/*...*/
};
for(var prop in proto) {
FooB.prototype[prop] = proto[prop];
}
只要proto
是一个“普通”对象(即不从另一个对象继承),就可以了。否则,您可能需要添加if(proto.hasOwnProperty(prop))
以仅添加非继承属性。一种解决方案是:
function FooB() {}
var p = new Foo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...
FooB.prototype = p;
更新:关于使用现有对象展开。始终可以将一个对象的现有特性复制到另一个对象:
FooB.prototype = new Foo();
var proto = {
/*...*/
};
for(var prop in proto) {
FooB.prototype[prop] = proto[prop];
}
只要proto
是一个“普通”对象(即不从另一个对象继承),就可以了。否则,您可能需要添加if(proto.hasOwnProperty(prop))
以仅添加非继承属性。每个对象只能有一个原型,因此如果您希望在继承(复制)原型后添加到原型,您必须扩展它,而不是分配新原型。例如:
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 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();
可以使用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;
}
可以使用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;
}
没有办法用另一个对象扩展原型而不覆盖它吗?@digitalFresh:没有,没有办法连接对象,因此必须将每个属性从一个对象复制到另一个对象。然而,这可以通过一个循环来完成。例如,jQuery.extend
方法就是这样做的。@digitalFresh-当然可以像@Guffa写的那样进行扩展。有关更多详细信息,请参见我的答案(不使用jQuery)。没有办法用另一个对象扩展原型而不覆盖它吗?@digitalFresh:没有,没有办法连接对象,因此必须将每个属性从一个对象复制到另一个对象。然而,这可以通过一个循环来完成。例如,jQuery.extend
方法就是这样做的。@digitalFresh-当然可以像@Guffa写的那样进行扩展。有关更多详细信息,请参见我的答案(不使用jQuery)。proto
可以是“普通”对象,但如果第三方脚本扩展了对象。prototype
最终会将这些值复制到FooB。prototype
proto
可以是“普通”对象,但是如果第三方脚本增加了Object.prototype
,那么最终会将这些值复制到FooB.prototype
。