Arrowletsのソース コードを調べていたところ、上部近くに次のセクションが見つかりました。
/*
* Box: a temporary (singleton) place to put stuff. Used as a helper for constructors with variadic arguments.
*/
function Box(content) {
Box.single.content = content;
return Box.single;
}
/* JavaScript hackery based on the strange semantics of "new":
* - Box() assigns Box.single.value, so Box.single has to be defined;
* - properties can be assigned to numbers (but have no effect);
* - when Box.single = 1 (or any non-Object), "new Box" returns "this". */
Box.single = 1;
Box.single = new Box;
Box.prototype.toString = function Box$prototype$toString() {
return "[Box " + this.content + "]";
}
また、ソース コードで の使用方法をいくつか調べBox
たところ、複数の引数を渡す別の方法のようですが、その方法がよくわかりません。また、コメントには次のように記載されています。
Box.single = 1 (または任意の非オブジェクト) の場合、「new Box」は「this」を返します。
new
しかし、コンストラクター関数が呼び出されるたびに,this
が返されると思いました。誰かが私にこれを説明してもらえますか?
更新:
Box.single
このアプローチが機能するために非オブジェクトに設定する必要がある理由と、new
オペレーターを使用したトリックで得られるものを理解するのに苦労しています。NodeJS repl の例:
いいえnew
、非オブジェクトを使用
> function Box(content) {
... Box.single.content = content;
... return Box.single;
... }
Box.single = {}; // NOTE: Setting Box.Single to an Object
{}
> //NOTE: Not using the "new" operator at all
undefined
> Box(23)
{ content: 23 }
> Box.single
{ content: 23 }
> Box({'name': 'John'})
{ content: { name: 'John' } }
> Box.single
{ content: { name: 'John' } }
new
とオブジェクトの使用
> function Box(content) {
... Box.single.content = content;
... return Box.single;
... }
undefined
> Box.single = {}; // Setting Box.single to an object
{}
> Box.single = new Box; // Using the new operator
{ content: undefined }
> Box({'name': 'John'})
{ content: { name: 'John' } }
> Box.single
{ content: { name: 'John' } }
Arrowletsのメソッドを使用するのとは対照的に:
> function Box(content) {
... Box.single.content = content;
... return Box.single;
... }
undefined
> Box.single = 1; // Setting Box.single to a Non-Object
1
> Box.single = new Box; // Using the new operator
{}
> Box(23)
{ content: 23 }
> Box({'name': 'John'})
{ content: { name: 'John' } }
> Box.single
{ content: { name: 'John' } }
アローレットのアプローチは、単純なことを達成するための複雑な方法にすぎないようです。私は何が欠けていますか?