使用 EcmaScript6 实现类似 mixin 的功能
Implementing mixin like functionality with EcmaScript6
从 Mootools 切换到 EcmaScript Classes 时,我需要向 classes 添加一些预构建的功能。喜欢活动...
Mootools 为此在 Class 中使用 Implements 参数。
var Widget = new Class({
Implements: Events,
initialize: function(element){
// ...
},
complete: function(){
this.fireEvent('complete');
}
});
上面,Implements 向 class 添加了一些方法。
网上有很多混合方法。但最后我感到困惑。为什么我们不简单地扩展事件 class 而是使用更复杂的混合应用程序。
我正在寻找干燥且易于重复使用的东西。喜欢这个;
class BaseAnimal {
//...
}
/* Events Mixin */
var Events={
//...
}
/* Options Mixin */
var Options={
//...
}
/* Extend base and add mixins */
class Parrot extends myMixinFuction(BaseAnimal,Events,Options){
//...
}
/* No Base. Only add mixin */
class Cat extends myMixinFuction(Events){
//...
}
myMixinFuction function (...args){
//do something that adds mixins to base class.
//if no base create one empty class and add mixinis to it
//return that Class
}
如果您正在寻找比事件混入更简单的解决方案,和您正在使用 DOM 元素,您可以考虑只触发原生 DOM 事件
附加事件侦听器
element.addEventListener("my:event", evt => myEventHandler(evt));
而不是 fireEvent
let evt = element.ownerDocument.createEvent('my:event');
evt.initEvent(eventtype, bubbles, cancelable);
evt.detail = detail;
let result = element.dispatchEvent(evt);
(气泡和可取消定义事件如何通过 DOM 传播,结果将是 'true',除非您的事件侦听器调用了 preventDefault)
从 Mootools 切换到 EcmaScript Classes 时,我需要向 classes 添加一些预构建的功能。喜欢活动...
Mootools 为此在 Class 中使用 Implements 参数。
var Widget = new Class({
Implements: Events,
initialize: function(element){
// ...
},
complete: function(){
this.fireEvent('complete');
}
});
上面,Implements 向 class 添加了一些方法。
网上有很多混合方法。但最后我感到困惑。为什么我们不简单地扩展事件 class 而是使用更复杂的混合应用程序。
我正在寻找干燥且易于重复使用的东西。喜欢这个;
class BaseAnimal {
//...
}
/* Events Mixin */
var Events={
//...
}
/* Options Mixin */
var Options={
//...
}
/* Extend base and add mixins */
class Parrot extends myMixinFuction(BaseAnimal,Events,Options){
//...
}
/* No Base. Only add mixin */
class Cat extends myMixinFuction(Events){
//...
}
myMixinFuction function (...args){
//do something that adds mixins to base class.
//if no base create one empty class and add mixinis to it
//return that Class
}
如果您正在寻找比事件混入更简单的解决方案,和您正在使用 DOM 元素,您可以考虑只触发原生 DOM 事件
附加事件侦听器
element.addEventListener("my:event", evt => myEventHandler(evt));
而不是 fireEvent
let evt = element.ownerDocument.createEvent('my:event');
evt.initEvent(eventtype, bubbles, cancelable);
evt.detail = detail;
let result = element.dispatchEvent(evt);
(气泡和可取消定义事件如何通过 DOM 传播,结果将是 'true',除非您的事件侦听器调用了 preventDefault)