“new Object()”和 object literal 表示法有什么区别?

2022-08-30 01:00:18

这种基于构造函数的语法用于创建对象之间有什么区别:

person = new Object()

...和此文字语法:

person = {
    property1 : "Hello"
};

似乎两者都做同样的事情,尽管JSLint更喜欢使用对象文字表示法。

哪一个更好,为什么?


答案 1

对于没有方法的简单对象,没有区别,如您的示例所示。但是,当您开始向对象添加方法时,会有很大的不同。

字面意思:

function Obj( prop ) { 
    return { 
        p : prop, 
        sayHello : function(){ alert(this.p); }, 
    }; 
} 

原型方式:

function Obj( prop ) { 
    this.p = prop; 
} 
Obj.prototype.sayHello = function(){alert(this.p);}; 

这两种方式都允许创建如下实例:Obj

var foo = new Obj( "hello" ); 

但是,使用字面方式,您可以在对象的每个实例中携带该方法的副本。然而,使用原型方式,该方法在对象原型中定义并在所有对象实例之间共享。如果您有很多对象或很多方法,那么字面上的方式可能会导致相当大的内存浪费。sayHello


答案 2

它们都做同样的事情(除非有人做了一些不寻常的事情),除了你的第二个对象创建一个对象并向其添加一个属性。但文字表示法在源代码中占用的空间更少。很明显,对于正在发生的事情,这是可以清楚地识别的,所以使用,你实际上只是在打更多的字,并且(理论上,如果没有通过JavaScript引擎优化的话)做一个不必要的函数调用。new Object()

这些

person = new Object() /*You should put a semicolon here too.  
It's not required, but it is good practice.*/ 
-or-

person = {
    property1 : "Hello"
};

从技术上讲,不要做同样的事情。第一个只是创建一个对象。第二个创建一个并分配一个属性。要使第一个属性相同,则需要执行第二个步骤来创建和分配属性。

有人可以做的“不寻常的事情”是影子或分配给默认的全局变量:Object

// Don't do this
Object = 23;

在这种非常不寻常的情况下,将失败,但会起作用。new Object{}

在实践中,从来没有理由使用而不是(除非你做了那件非常不寻常的事情)。new Object{}