2

如何将函数的原型附加到另一个函数?就像是:

// Foo
function foo(){};
foo.prototype.a = 'hello';

// Bar
function bar(){}
bar.prototype.b = 'world';

// Append Foo's prototype to Bar
bar.appendPrototype(foo);

// Print
console.log(bar.prototype) // -> { a: 'hello', b: 'world' }
4

2 回答 2

6

您可以迭代源原型的道具并将每个道具添加到目标原型中。这假设 src 原型的属性是可以复制的简单属性(如函数或简单值,而不是对象本身),通常情况就是这样。如果要允许嵌套对象本身的原型属性,则需要克隆每个属性。通常这不是必需的,所以这里是更简单的版本:

bar.appendPrototype = function(src) {
    for (var prop in src.prototype) {
        this.prototype[prop] = src.prototype[prop];
    }
}

bar.appendPrototype(foo);

原型只是对象,因此您可以将一个原型的属性复制到另一个原型。


几年后更新。 这种将方法从一个原型复制到另一个原型的一般概念创建了通常称为“mixin”的东西,您将一个类的方法混合到另一个类中,以便创建一个具有两个对象功能的新对象。这是一篇关于该主题的有趣文章,有助于解释。

在实现 mixins 时,现在可以Object.assign()在一个函数调用中将属性从一个对象复制到另一个对象,而不是编写自己的循环。

您甚至可以对以前使用 ES6class语法声明的类进行混入。

一个相当常见的 mixin 示例是您已经有一个类层次结构(因此您不能只继承),现在您希望叶类也是一个eventEmitter并具有该发射器的所有功能。您可以“混合” EventEmitter 对象,现在您之前声明的类也具有EventEmitter. 您需要采取的一项预防措施(与子类化时相同)是您需要确保两个对象实现之间没有实例属性名称冲突,因为混合代码和您的代码都将访问同一个核心实例对象。

上例中 mixin 的替代方法是向叶类实例数据添加一个单独的 EventEmitter 对象。就像在this.emitter = newEventEmitter() . Then, to access the emitter, rather thanthis.emit(...) , you would dothis.emitter.emit(...)` 中一样。这也有效,但通常不方便或简洁。

于 2013-01-06T02:10:37.327 回答
0

这很容易做到。

function foo(){};
foo.prototype.a =2;

function bar(){
    foo.call(this,null);
}
bar.prototype.b=4;
console.log(bar.prototype); //{a:2,b:4}
于 2013-01-06T02:24:18.630 回答