this.subscribe = function(key, func) { /* elided */ };
здесь вы добавляете метод к текущему thisContext
.
Inherit(Widget, EventRaiser)
Здесь ваша продажа прототипа Widget должна потреблять прототип EventRaiser.
Лучшее, что вы можете сделать, это не смешивать this.x
с prototype.y
Или вы можете позвонить EventRaiser.call(this)
внутри function Widget() { }
, но это плохой стиль.
Если вы собираетесь использовать шаблон наследования, я бы порекомендовал вам использовать Object.create
& pd
:
// prototype
var EventRaiser = {
D: function() { alert("D"); },
subscribe: function(key, func) { ... }
};
// factory
var eventRaiser = function _eventRaiser(proto) {
proto = proto || EventRaiser;
return Object.create(proto, pd({
events: {}
}));
};
// prototype
var Widget = {
...
};
// factory
var widget = function _widget() {
var o = eventRaiser(pd.merge(Widget, EventRaiser));
Object.defineProperties(o, pd({
...
});
return o;
};
Или, если вы настаиваете Widget
должен наследовать от EventRaiser
var Widget = Object.create(EventRaiser, pd({
...
});
var widget = function _widget() {
var o = eventRaiser(Widget);
Object.defineProperties(o, pd({
...
});
return o;
}
Причин для рекомендации этого шаблона является четкое разделение прототипа и фабрики.Это позволяет взаимодействовать с прототипом, не обращаясь с фабрикой.Используя ключевое слово new
, вы запачкаете эти воды (как показано в вашем коде), и вы также склонны взламывать this
вокруг.
Приведенный выше код также не выглядит элегантно.Это означает, что вы действительно должны искать другую модель.Например, EventEmitter
из node.js имеет явную проверку для объекта this._events
, что делает код фабрики более элегантным.