假设我有一个具有我手动设置的原型属性的对象。
一个例子是
function A() {
};
A.prototype.B = function() {
};
A.prototype.C = function() {
};
A.prototype.D = function() {
};
如何使用A
的原型扩展另一个对象?
我试过的是这个;
// obj = extend to object
// obj2 inherit from object
for (var prop in obj2.prototype) {
if (obj2.prototype.hasOwnProperty(prop)) {
obj.prototype[prop] = obj2.prototype[prop];
}
}
使用obj2.hasOwnProperty(prop)
是否确保只复制A
原型上的属性?
有更好的方法吗?
答案 0 :(得分:1)
通常,尝试将其他语言的模式模拟为Javascript并不总是可取的。 Javascript使用原型继承,而不是标准的OO继承(例如你在Java中所做的)。是的,你可以将方法从一个原型复制到另一个原型,但并不总是可取的,因为你真的把内部物体封装在水中。如果您确实想要复制方法,只需将一个对象原型设置为等于另一个即可。
这是继承的一种模式
// object we want to inherit from
function bar() {}
bar.prototype.original = function() {}
// object which will inherit bar
function foo() {}
// first map prototypes
foo.prototype = new bar();
// add additional methods to foo
foo.prototype.somethingElse = function() {}
正如一些评论者指出的那样,您可以new bar()
执行Object.create(bar)
而不是bar
,但IE8及以下版本不支持此功能。两者之间唯一的功能区别是新的bar()将执行Object.create()
的构造函数,而后者则不会,这对您来说可能或不重要。 // object we want to inherit from
function bar() {}
bar.prototype.original = function() {}
function foo() {
this.bar = new bar();
}
foo.prototype.somethingElse = function() {
// foo has a bar, but isn't a bar
this.bar.original();
}
在技术上是更正确的方法,但除非你愿意失去IE8或使用垫片,否则可能是一个交易破坏者。
这是另一种模式,我的首选,使用构图
{{1}}