正當我認爲自己對原型繼承在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中構建這種類型的東西的人? –