2016-08-19 5 views
0

this previous questionへの回答で、Objectのコンストラクタに引数を渡す目的は何ですか?次のコードに従って関数として使用しますか?単一の引数をObject()に渡す目的は?

function makeFoo(a, b) { 
    var foo = Object.create(Foo.prototype); 
    var result = Foo.apply(foo, arguments); 
    return Object(result) === result ? result : foo; 
} 
+3

[こちらは、MDNのドキュメントにあります](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)を参照してください。 – Pointy

+1

そして、あなたは知っています、[仕様](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-object-value)。 –

答えて

3

オブジェクトコンストラクタは、すでにオブジェクトであればそのパラメータを返します。したがって、あなたのコードが行っているのは、resultの値がオブジェクトであるかどうかを調べることです。

もう1つの質問から、その目的は、new以外で呼び出されたときに、 "Foo"コンストラクタが非オブジェクト(文字列など)を返そうとする可能性があるという事実に対処することです。 newでコンストラクタを呼び出すと、非オブジェクトの明示的な戻り値は無視され、戻り値は構築されたオブジェクトになります。

"makeFoo"の最後の行が、返された値がすでにオブジェクトであるかどうかを確認します。そうである場合、Objectコンストラクタは新しいオブジェクトを作成せずに参照を返します。したがって、パラメータ( "result")には===になります。それが===でない場合は、コンストラクタが何か変わったことを意味し、構築された "foo"インスタンスが代わりに返されることを意味します。

もう1つの質問はこれを「ハック」と説明しています。

+1

この回答をupvoting私の最後の投票。 –

+1

@ T.J.Crowder haha​​。これは私がStackoverflowについて愛しているものの1つです。私はこの種のアーケナを知るためにはどんなに奇妙な状況があるのだろうと想像することはできませんが、あなたは本当にそのような質問に答える言葉の暗い部分に慣れています。 – Pointy

+3

もし 'new'をエミュレートしようとすれば' new'で作成された関数から 'null'を返すとき' null'を返すので、 'new'で作成されたオブジェクトが返されるのに対して、' Foo' 'null'を返すと結果は新しいオブジェクトになります。 (どのようにアーケードのために?;-)) –

関連する問題