如何将一个函数的原型附加到另一个?类似于:
// 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' }
您可以迭代源原型的道具,并将每个道具添加到目标的原型。假设src原型的属性是可以复制的简单属性(例如函数或简单值,而不是对象本身),通常是这种情况。如果要允许原型属性本身是嵌套对象,则需要克隆每个属性。通常不需要,所以这里是更简单的版本:
bar.appendPrototype = function(src) {
for (var prop in src.prototype) {
this.prototype[prop] = src.prototype[prop];
}
}
bar.appendPrototype(foo);
原型只是对象,因此您可以将一个原型的属性复制到另一个原型。
几年后更新。这种将方法从一个原型复制到另一个原型的一般概念创建了一个通常称为“ mixin”的概念,您可以在其中将一个类的方法混合到另一个类中,从而创建一个新的对象,具有两个对象的功能。这是有关主题的interesting article,可以帮助解释。
在实现mixin时,现在可以使用Object.assign()
在一个函数调用中将属性从一个对象复制到另一个对象,而不用编写自己的循环。
您甚至可以对以前使用ES6 class
语法声明的类进行混合。
mixin的一个相当常见的例子是,您已经具有一个类层次结构(因此您不能只是继承),现在您希望叶子类也成为eventEmitter
,并具有该发射器的所有功能。您可以“混合” EventEmitter对象,现在您先前声明的类还具有EventEmitter
的功能。您需要采取的一项预防措施(与子类化相同)是,您需要确保两个对象实现之间的实例属性名称没有冲突,因为mixin代码和您的代码都将访问同一核心实例对象。
在上面的示例中,mixin的替代方法是仅向叶类实例数据中添加一个单独的EventEmitter对象。与this.emitter = new
EventEmitter(). Then, to access the emitter, rather than
this.emit(...)中一样。这也可以,但是通常不那么方便或简洁。
很容易做到。
, you would do