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
要約すると、私は各 newがプロパティを継承し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 プロトタイプでこれを行う方法を学びたいと思います。