2

これは初心者のクエリです。私はいくつかの同様の投稿を経験しましたが、それらは私を十分に助けていません。この投稿には2つのクエリがありますが、ルートが同じように見えるため、まとめています。

私は次のコードスニペットに出くわしました:

var Server = module.exports.Server = function Server(listener) {
  if (!(this instanceof Server)) return new Server(listener);
  //other code
}

module.exports.createServer = function(listener) {
  return new Server(listener);
};

if (!(this instanceof Server)) ;ここでサーバーを指すことができない場合の使用法を理解できません か?

私はこれを簡単にテストしてみました:

var createTest = function(){
    console.log(this.toString());
    return new Test();
};

var Test = function Test(){
    console.log(this instanceof Test);
    console.log(this.toString());
    if (!(this instanceof Test)) 
    {
        return new Test();
    }
}

var tester = createTest();

出力:

[object global]
true
[object Object]

this.toStringが[objectObject]を出力する理由についてさらに混乱します-[objectTest]ではないでしょうか?

ありがとう !

4

2 に答える 2

5

これは、オプションにするために使用されるイディオムnewです。例えば:

function TraditionalTest() {
}
function IdiomaticTest() {
    if(!(this instanceof IdiomaticTest)) return new IdiomaticTest();
}

console.log(new TraditionalTest());  // [object Object]
console.log(TraditionalTest());      // undefined
console.log(new IdiomaticTest());    // [object Object]
console.log(IdiomaticTest());        // [object Object]

なぜで[object Object]はなく[object Test]、なぜそのように定義されているのかわかりませんが、それが定義されている方法です

toStringメソッドが呼び出されると、次の手順が実行されます。

  1. this値がの場合はundefined、「」を返し[object Undefined]ます。
  2. this値がの場合はnull、「」を返し[object Null]ます。
  3. 引数として値を渡してToObjectを呼び出した結果をOとthisします。
  4. classをOの[[Class]]内部プロパティの値とします
  5. [object3つの文字列" "、class、および" "を連結した結果であるString値を返します]

[[Class]]は仕様で何度か参照されていますが、組み込み型のみを表しています。

  • Arguments
  • Array
  • Boolean
  • Date
  • Error
  • Function
  • JSON
  • Math
  • Number
  • Object
  • RegExp
  • String
于 2012-10-10T04:22:20.063 に答える
1

このテストでは、次の両方の用途でインスタンス化された新しいサーバーが作成されていることを確認します。

new module.exports.Server()

および:

module.exports.Server()

2番目の例では、thisポインターはグローバルオブジェクトであるため、Testのインスタンスではありません。その場合、コードは、コンストラクター関数が直接呼び出されただけでnew、新しいオブジェクトが作成されなかったことを認識します。newこれはコンストラクターの使用目的ではないため、コンストラクターを呼び出して結果を返すことにより、aを強制的に使用します。

于 2012-10-10T04:22:15.497 に答える