コンストラクターからオブジェクトを返すと、コンストラクターによって自動的に生成されたインスタンスを返す代わりに、そのオブジェクトが使用されます。少し抽象的なので、私の要点を示す例を次に示します。
function Foo() {}
function Bar() {
return new Foo();
}
f = new Foo();
console.log(f instanceof Foo); //true
b = new Bar();
console.log(b instanceof Bar); //false
console.log(b instanceof Foo); //true
JavaScript では、関数を含むすべてがオブジェクトであるため、foo.bar
関数が関数を返すということは、呼び出したときに、新しいインスタンスではなく、new foo.bar()
によって返された関数を受け取ることを意味します。foo.bar
foo.bar
何をしようとしているのか正確にはわかりませんが、コンテキストで使用するだけで、関数がオブジェクト初期化子として呼び出されているのか、関数として呼び出されているのかを確認できます。instanceof
このパターンは、オブジェクトの初期化を強制するためによく使用されます。
function Foo(...arguments...) {
if (!(this instanceof Foo)) {
return new Foo(...arguments...);
}
//do stuff
}
これによりFoo
、関数として呼び出すことができ、新しいFoo
インスタンスを返すことができます:
a = new Foo(); //a instanceof Foo
b = Foo(); //b instanceof Foo