コンストラクターによって作成された JavaScript オブジェクトのすべてのインスタンスにデータ/関数を追加して、すべてのインスタンスがそのコピーではなく同じ参照を持つようにするにはどうすればよいですか?
基本的に、C# で静的メソッドに相当するものを実装します。
たとえば、Widget クラスを作成する次のコードがあるとします。
(function() {
var Widget = function() {
};
Widget.prototype.init = function(data) {
this.data = data;
};
this.Widget = Widget;
}).call(this);
var instance1 = new Widget();
instance1.init('inst1');
var instance2 = new Widget();
instance2.init('inst2');
alert(instance1.data); // inst1
alert(instance2.data); // inst2
上記の場合、各インスタンスには独自の data プロパティのコピーがあります。ただし、現在および将来のすべてのインスタンスのデータを設定する関数を追加したいと考えています。
私の現在の解決策は、プロトタイプではなく、コンストラクター関数オブジェクトに関数を追加することです。たとえば、以下を参照してください。これには落とし穴があり、より良い方法はありますか?
(function() {
var Widget = function() {
};
Widget.prototype.init = function(data) {
this.data = data;
};
Widget.addStaticData = function(data) {
this.staticData = data;
};
Widget.prototype.getStaticData = function() {
return Widget.staticData;
};
this.Widget = Widget;
}).call(this);
var instance1 = new Widget();
instance1.init('inst1');
Widget.addStaticData('static');
var instance2 = new Widget();
instance2.init('inst2');
alert(instance1.data); // inst1
alert(instance2.data); // inst2
alert(instance1.getStaticData()); // static
alert(instance2.getStaticData()); // static