正当我认为自己对原型继承在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
这变得更加难以处理。我以为我可以解决这个问题如下:我敢肯定,你们谁在JavaScript中更有经验实现,这将引发一个错误
var Model = function() {
this.prototype.constructor.apply(this, arguments);
};
Model.prototype = new Observable();
Alhtough: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的原型不使用类库做到这一点。
问题是.....? – HMarioD
我有这个确切的问题,试图建立一个Observable类。当然,我们不能成为第一个在JS中构建这种类型的东西的人? –