以下を実現するための最適な設計パターンは何ですか (これは機能しません)?
var obj = (function() {
// code defining private variables and methods
var _obj = {
property: value,
method1: function() {
// do stuff
},
method2: function() {
// use property
var prop = _obj.property; // obviously doesn't work
// call method1
obj.method1(); // "obj" not finished being defined yet!
}
};
// obviously now I could do...
var prop = _obj.property;
return _obj;
})();
// and I could now do...
obj.method1();
うまくいくと思うバリエーションは
var obj = (function() {
var property = value,
method1 = function() {
// do stuff
},
method2 = function() {
// use property
var prop = property;
// call method1
method1();
},
_obj = {
property: property,
method1: method1,
method2: method2
};
return _obj;
})();
同様に、演算子を使用して作成することを意図したオブジェクトではどのように機能しますかnew
? コンストラクター関数自体の中では、 と記述できますthis.method()
。しかし、コンストラクターを小さく保ち、作成時にカスタマイズされる可能性のあるものだけを定義し、残りをプロトタイプで定義したい場合はどうでしょうか? (これが一般的なパターンのようです。) プロトタイプ内のプロパティ/メソッドは、何らかの形で相互作用できますか?
var MyObj = function(name) {
this.name = name;
};
var obj = new MyObj('Bob');
MyObj.prototype = {
called_often: function() {
// lots more code than just the following
return document.getElementById('someID').value;
},
global_default: 'value', // can be changed, so need to pull value when run
does_stuff: function(value) {
var str = global_default + value, // can't access global_default on its own
input = MyObj.called_often(), // doesn't work; MyObj.prototype.called_often() DOES
name = this.name; // 'this' used in the prototype doesn't work
// even within a created object
return name + input + str;
}
};
この問題に遭遇したときはいつでも、結果を達成するためのより良い方法があるはずです。このコードは特定の状況に限ったものではなく、一般的な問題を示しているだけです。したがって、私が遭遇した特定の状況に対する代替案を提示することはできません。しかし、全体的な考え方について助けていただけるかもしれません。
ベストアンサー1
さて、最初の例から:
var _obj = {
property: value,
method1: function() {
// do stuff
},
method2: function() {
// use property
var prop = this.property;
// call method1
this.method1();
}
};
それがthis
価値の源です。
ここでできないのは、オブジェクト リテラル構文の他の場所から「構築中」のオブジェクトのプロパティを参照することです。(構文的に不可能なので、例を挙げるのは難しいです。) これを実行する場合は、1 つ以上の個別の代入ステートメントが必要です。