1

この MSDN の記事によると、( MDN JSConstructor Functions but No Classesリファレンスを読んだ後)までスクロールすると、次のようなオブジェクトを作成できるはずです。

function Dog(name){
    this.name = name;
}

// EXAMPLE 1
var dog = new Dog("Spot");
console.log("Dog using new:");
console.log(dog); // Dog object, awesome!

// EXAMPLE 2
var dog = {};
dog = Dog.call(dog,"Rowdie");
console.log("Dog using call:");
console.log(dog); // Undefined.. why?

ただし、最初の例 (新しいオブジェクトを構築する最も一般的な方法) では期待されるインスタンスが返されますが、2 番目の例では返されますundefined

これをテストするために使用した JSFiddle は次のとおりです: http://jsfiddle.net/wk8JD/1/

4

1 に答える 1

7

変化する

dog = Dog.call(dog,"Rowdie");

Dog.call(dog,"Rowdie");

で関数を呼び出すとnew、 thenthis暗黙的に返されます。つまり、関数はreturn this;最後に持っていたかのように動作します。MDN ドキュメントから:

コンストラクター関数によって返されるオブジェクトは、式全体の結果になりnewます。コンストラクター関数が明示的にオブジェクトを返さない場合は、代わりに手順 1 で作成されたオブジェクトが使用されます。(通常、コンストラクターは値を返しませんが、通常のオブジェクト作成プロセスをオーバーライドする場合は、値を返すことを選択できます。)

しかし、関数を「普通に」(つまり なしで) 呼び出すと、ステートメントがなければnew戻ります。undefinedreturn

(記事では、どちらの戻り値も代入していません)

于 2013-06-18T08:55:14.657 に答える