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 怎么会与它一起使用呢?另外,为什么原型可以用新对象访问,但不能用对象文字符号访问?

编辑:

我现在明白了,如果有其他人偶然发现这个问题/问题,这可能会帮助你理解它:

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无关,而是. 使用,将是对 foo 内部的一个实例的引用。没有新的,将是全局的(可能)thisfoo()newthisfoo()thiswindow

于 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 回答