4

假设我有一个具有手动设置的原型属性的对象。

一个例子是

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我拥有的原型上的属性才会被复制?

有没有更好的方法来做到这一点?

4

1 回答 1

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()你可以做而不是做,但 IE8 及更低版本不支持。Object.create(bar)两者之间唯一的功能区别是 new bar() 将执行 的构造函数bar,而后者不会,这对您来说可能很重要,也可能无关紧要。Object.create()从技术上讲,这是更正确的方法,但可能会破坏交易,除非您愿意失去 IE8 或使用 shim。

这是另一种模式,我的首选,使用组合代替

// 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();
}
于 2013-05-15T01:43:41.290 回答