JavaScriptモジュールパターンとJavaScriptコンストラクター関数を混同していると思います。
JavaScriptコンストラクター関数
関数を記述し、そのnew
前にキーワードを付けて呼び出すと、その関数はコンストラクター関数として呼び出されます。
this
キーワードを使用してコンストラクター関数内で参照できる新しいオブジェクトが自動的に返されます。
var Test = function() {
var that = this;
this.something = function () {
console.info(that);
console.info(this);
};
}
var test1 = new Test();
test1.something();
代わりに独自のオブジェクトを返すことができますが、通常はコンストラクターでそれを行うことはなく、this
代わりに次のように使用します。
var Test = function() {
var that = this;
return {
something: function () {
console.info(that);
console.info(this);
}
};
}
var test1 = new Test();
test1.something();
その前にキーワードを付けて呼び出さない場合new
は、通常の関数のように呼び出されます。つまり、this
その内部への参照は、関数がプロパティであるオブジェクトを参照します(他に何も存在しない場合)。 、はグローバルオブジェクトになります。これはWebブラウザではwindow
)です。
var geoff = {
Test: function () {
var that = this;
return {
something: function () {
console.info(that);
}
};
}
};
var test2 = geoff.Test();
var test3 = Test();
注:コンストラクター関数では、通常、プロトタイプオブジェクトでメソッドを定義するため、コンストラクター関数を使用して作成するオブジェクトごとにメソッドが不必要に再定義されることはありません。
var Test = function() {
this.else = "Something Else"
}
Test.prototype.something = function () {
console.info(this);
}
Test.prototype.somethingElse = function () {
console.info(this.else);
}
var test4 = new Test();
test1.somethingElse() // Logs "Something Else"
(前述のようにコンストラクター関数から独自のオブジェクトを返すと、プロトタイプオブジェクトのメソッドにアクセスできなくなることに注意してください。)
また、コンストラクター関数を呼び出すたびに、新しいオブジェクトが返されることにも注意してください。(他の関数と同じように)コンストラクター関数にパラメーターを渡し、それらを使用して、返されるオブジェクトをカスタマイズできます。
var Test = function(else) {
this.else = else;
}
Test.prototype.somethingElse = function () {
console.info(this.else);
}
var test1 = new Test("Something else");
var test2 = new Test("Something else again");
test1.somethingElse(); // Logs "Something else"
test2.somethingElse(); // Logs "Something else again"