1
function foo() {
    return {a:9};
}

var bar = foo();
bar.a //returns 9

また

function foo() {
    return {a:9};
}

var bar = new foo(); 
bar.a // returns 9

私が知る限り、new はオブジェクト リテラル表記では使用されませんが、どうして new がそれで機能するのでしょうか? また、prototype は new object でアクセスできるのに、オブジェクト リテラル表記ではアクセスできないのはなぜですか?

編集:

この問題/質問に出くわした他の誰かがそれを理解するのに役立つかもしれません:

function foo() {
    this.a = "LOL";
    return "WTF";
};
var bar = new foo(); // bar = [Object object]
var c = foo(); // c = "WTF"
window.a // "LOL"

受け入れられた回答も読んでください。

4

3 に答える 3

7

この状況での使用newは、あなたが返すものとは何の関係もありませんがthisfoo(). を使用するとnewthis内の foo インスタンスへの参照になりますfoo()。新規thisがなければ、グローバルになります(おそらくwindow

于 2012-12-06T19:27:50.953 に答える
5

これが機能するのは、( を使用して) コンストラクターとして呼び出されている関数から非プリミティブ型を明示的に返すとnew、作成されたオブジェクトの代わりにそのオブジェクトが返されるためです。作成されたオブジェクトを関数で使用していないため、new冗長です。

ここでは、プリミティブでは機能しないことがわかります。

function test() {
    return "string"; //This is not returned when called with new, because it's primitive
}

var a = new test();
a == "string" // false

function test() {
    return new String("string"); //This is returned when called with new, because it's an object, like {}
}

var b = new test();
b == "string" //true

デモンストレーションの目的で==とを使用しています。実際には絶対にnew String使用しないでください。new String

于 2012-12-06T19:29:55.570 に答える
1

{}は単なるショートカットですnew Object()

于 2012-12-06T19:27:03.963 に答える