就在我认为我已经掌握了 JavaScript 中原型继承的工作原理时,我遇到了一个我之前没有考虑过的问题。
看一下以下简单的 JavaScript 代码:
var Observable = function () {
this.events = [];
};
Observable.prototype.addEvent = function (e) {
this.events.push(e);
};
var Model = function () {};
Model.prototype = new Observable();
var appModel = new Model();
var taskModel = new Model();
appModel.addEvent('Hello');
taskModel.addEvent('World');
查看其中一个appModel.events
或taskModel.events
产生相同的数组:['Hello', 'World']
. 我想做的是让每个新Model
的都有自己的events
阵列,尽可能干净。以下实施Model
作品:
var Model = function () {
this.events = [];
};
Model.prototype = new Observable();
然而,随着更多的属性被添加到Observable
这变得更加笨拙。我想我可以按如下方式解决这个问题:
var Model = function () {
this.prototype.constructor.apply(this, arguments);
};
Model.prototype = new Observable();
尽管我确信那些在 JavaScript 方面更有经验的人意识到这会引发错误:TypeError: Cannot read property 'constructor' of undefined
.
总之,我正在寻找一种方法让每个新Model
的继承属性,Observable
并让每个新Model
的events
. 我意识到这非常类似于类,但我想知道如何仅使用基于 JavaScript 原型的继承来做到这一点。
值得注意的是,我查看了 Dean Edward 的 Base.js。以下作品:
var Observable = Base.extend({
constructor: function () {
this.events = [];
},
addEvent: function (e) {
this.events.push(e);
}
});
var Model = Observable.extend({
constructor: function () {
this.base();
}
});
var appModel = new Model();
var taskModel = new Model();
appModel.addEvent('Hello');
taskModel.addEvent('World');
但以下没有:
var Observable = Base.extend({
events: [],
addEvent: function (e) {
this.events.push(e);
}
});
var Model = Observable.extend({
constructor: function () {
this.base();
}
});
var appModel = new Model();
var taskModel = new Model();
appModel.addEvent('Hello');
taskModel.addEvent('World');
除此之外,我想学习如何在不使用类库的情况下使用 JavaScript 原型来做到这一点。