JavaScript Garden-構造関数
4980 ワード
構造関数
JavaScriptの構造関数と他の言語の構造関数は違っています.通過する
コンストラクタの内部で-つまり呼び出された関数の中で-
工場モード
使わないために
注意が必要です
上記の例では、使用または使用しない
訳者注:上記2つの方式で作成されたオブジェクトはアクセスできません.
私たちがよく耳にする忠告は使わないことです.
新しいオブジェクトを作成するために、工場法を作成し、方法内で新しいオブジェクトを作成することができます.
新たに作成したオブジェクトは原型上の方法を共有できないので、メモリをもっと使うことができます.継承を実現するためには、工場法は、他のオブジェクトからすべての属性をコピーしたり、オブジェクトを新規作成の対象とするプロトタイプが必要です.原型チェーンを放棄するのは、漏れ防止だけです.
漏れても
JavaScriptの構造関数と他の言語の構造関数は違っています.通過する
new
キーワード方式で呼び出された関数はすべて構造関数として考えられています.コンストラクタの内部で-つまり呼び出された関数の中で-
this
新規作成のオブジェクトを指します. Object
.この新しく作成したオブジェクトの プロトタイプ コンストラクタに向けられた prototype
呼び出された関数が明示的でない場合 return
表式を使うと、暗黙的に返されます. this
オブジェクト→新規作成の対象です.function Foo() {
this.bla = 1;
}
Foo.prototype.test = function() {
console.log(this.bla);
};
var test = new Foo();
上のコードを Foo
コンストラクタとして呼び出し、新規作成対象の prototype
を選択します Foo.prototype
明示的 return
表式は戻りの結果に影響しますが、戻りの対象に限ります.function Bar() {
return 2;
}
new Bar(); //
function Test() {
this.value = 2;
return {
foo: 1
};
}
new Test(); //
訳者注:new Bar()
は、新しく作成されたオブジェクトで、数字のワード値2ではありません.したがって new Bar().constructor === Bar
ですが、もし戻ってきたのがデジタルオブジェクトであれば、結果は違っています.function Bar() {
return new Number(2);
}
new Bar().constructor === Number
訳者注:ここで得た new Test()
は、new
キーで新たに作成されたオブジェクトではなく、関数が返されるオブジェクトであるため、(new Test()).value === undefined
(new Test()).foo === 1
もし new
欠落した場合、関数は新しく作成したオブジェクトに戻りません.function Foo() {
this.bla = 1; //
}
Foo(); // undefined
上の例では正常に動作する場合もありますが、JavaScriptでは this 仕事の原理はここです. this
グローバルオブジェクトを指します.工場モード
使わないために
new
キーワード、コンストラクタは値を明示的に返さなければなりません.function Bar() {
var value = 1;
return {
method: function() {
return value;
}
}
}
Bar.prototype = {
foo: function() {}
};
new Bar();
Bar();
上の二つが正しいです Bar
関数の呼び出しで返した値は全く同じで、新しく作成した所有者 method
属性のオブジェクトは戻りますが、ここでは包みを閉じるが作成されています.注意が必要です
new Bar()
戻る対象の原型は変わりません. Bar.prototype
)コンストラクタのプロトタイプは作成したばかりの新しいオブジェクトに向けられます.ここのプロトタイプは Bar
この新しいオブジェクトを返しませんでした. method
属性のカスタムオブジェクト)上記の例では、使用または使用しない
new
キーワードには機能性の違いがありません.訳者注:上記2つの方式で作成されたオブジェクトはアクセスできません.
Bar
プロトタイプチェーン上の属性は、以下のようになります.var bar1 = new Bar();
typeof(bar1.method); // "function"
typeof(bar1.foo); // "undefined"
var bar2 = Bar();
typeof(bar2.method); // "function"
typeof(bar2.foo); // "undefined"
工場モードで新規オブジェクトを作成私たちがよく耳にする忠告は使わないことです.
new
キーワードを使って関数を呼び出します.これを忘れたらエラーが発生します.新しいオブジェクトを作成するために、工場法を作成し、方法内で新しいオブジェクトを作成することができます.
function Foo() {
var obj = {};
obj.value = 'blub';
var private = 2;
obj.someMethod = function(value) {
this.value = value;
}
obj.getPrivate = function() {
return private;
}
return obj;
}
上記の方式は new
の呼び出し方式は間違えにくく、訳者注による便利さを十分に利用することができます.新たに作成したオブジェクトは原型上の方法を共有できないので、メモリをもっと使うことができます.継承を実現するためには、工場法は、他のオブジェクトからすべての属性をコピーしたり、オブジェクトを新規作成の対象とするプロトタイプが必要です.原型チェーンを放棄するのは、漏れ防止だけです.
new
持ってきた問題は言語そのものの思想とは違うようです.締め括りをつける漏れても
new
キーワードは問題になるかもしれませんが、プロトタイプチェーンの使用を放棄する口実ではありません.最終的にどのような方法を使うかは、アプリケーションのニーズに応じて、コードを選んでスタイルを書き続けていくことが一番重要です.