下面这些基于构造函数的创建对象的语法有什么区别:
person = new Object()
...这个文字语法:
person = {
property1 : "Hello"
};
看起来两者都做同样的事情,尽管JSLint更喜欢使用对象文字表示法。
哪个更好,为什么?
下面这些基于构造函数的创建对象的语法有什么区别:
person = new Object()
...这个文字语法:
person = {
property1 : "Hello"
};
看起来两者都做同样的事情,尽管JSLint更喜欢使用对象文字表示法。
哪个更好,为什么?
当前回答
它们都做同样的事情(除非有人做了不寻常的事情),除了第二个创建一个对象并向其添加一个属性。但是文字符号在源代码中占用的空间更少。可以清楚地看出发生了什么,因此使用new Object()实际上只是输入了更多内容,并且(理论上,如果JavaScript引擎没有优化的话)执行了不必要的函数调用。
这些
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而不是{}(除非您做了非常不寻常的事情)。
其他回答
它们都做同样的事情(除非有人做了不寻常的事情),除了第二个创建一个对象并向其添加一个属性。但是文字符号在源代码中占用的空间更少。可以清楚地看出发生了什么,因此使用new Object()实际上只是输入了更多内容,并且(理论上,如果JavaScript引擎没有优化的话)执行了不必要的函数调用。
这些
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而不是{}(除非您做了非常不寻常的事情)。
在JavaScript中,我们可以用两种方式声明一个新的空对象:
var obj1 = new Object();
var obj2 = {};
我没有发现任何迹象表明这两家公司在幕后的运作方式有任何显著差异(如果我错了,请纠正我——我很想知道)。然而,第二种方法(使用对象文字表示法)提供了一些优点。
它更短(准确地说是10个字符) 动态创建对象更容易,也更结构化 如果某个小丑无意中覆盖了Object也没关系
考虑一个包含成员Name和TelNo的新对象。使用新的Object()约定,我们可以像这样创建它:
var obj1 = new Object();
obj1.Name = "A Person";
obj1.TelNo = "12345";
JavaScript的Expando Properties特性允许我们以这种方式动态地创建新成员,我们实现了我们的意图。但是,这种方式不是非常结构化或封装的。如果我们希望在创建时指定成员,而不必依赖于expando属性和创建后赋值,该怎么办?
这就是对象文字表示法可以帮助的地方:
var obj1 = {Name:"A Person",TelNo="12345"};
在这里,我们用一行代码和更少的字符实现了同样的效果。
关于上述对象构造方法的进一步讨论可以在:JavaScript和面向对象编程(OOP)中找到。
最后,那个覆盖Object的白痴呢?你觉得不可能吗?这个JSFiddle证明了事实并非如此。使用对象文字表示法可以防止我们犯这种错误。
(来自http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/)
对于没有方法的简单对象(如您的示例)没有区别。 然而,当开始向对象添加方法时,就有很大的不同了。
文字:
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方法的副本。而在原型方法中,方法定义在对象原型中,并在所有对象实例之间共享。 如果有很多对象或方法,文字方式会导致相当大的内存浪费。
唯一一次我将使用'new' keyowrd对象初始化是在内联箭头函数:
() => new Object({ key: value})
因为下面的代码是无效的:
() => { key: value} // instead of () => { return { key: value};}
这里的每个人都在谈论这两者的相似之处。我会指出它们的不同之处。
Using new Object() allows you to pass another object. The obvious outcome is that the newly created object will be set to the same reference. Here is a sample code: var obj1 = new Object(); obj1.a = 1; var obj2 = new Object(obj1); obj2.a // 1 The usage is not limited to objects as in OOP objects. Other types could be passed to it too. The function will set the type accordingly. For example if we pass integer 1 to it, an object of type number will be created for us. var obj = new Object(1); typeof obj // "number" The object created using the above method (new Object(1)) would be converted to object type if a property is added to it. var obj = new Object(1); typeof obj // "number" obj.a = 2; typeof obj // "object" If the object is a copy of a child class of object, we could add the property without the type conversion. var obj = new Object("foo"); typeof obj // "object" obj === "foo" // true obj.a = 1; obj === "foo" // true obj.a // 1 var str = "foo"; str.a = 1; str.a // undefined