这个用于创建对象的基于构造函数的语法有什么区别:
person = new Object()
...还有这个字面语法:
person = {
property1 : "Hello"
};
看起来两者都做同样的事情,尽管 JSLint 更喜欢您使用对象文字表示法。
哪个更好,为什么?
这个用于创建对象的基于构造函数的语法有什么区别:
person = new Object()
...还有这个字面语法:
person = {
property1 : "Hello"
};
看起来两者都做同样的事情,尽管 JSLint 更喜欢您使用对象文字表示法。
哪个更好,为什么?
与您的示例中一样,没有方法的简单对象没有区别。但是,当您开始向对象添加方法时,会有很大的不同。
字面方式:
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 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 = {};
我没有发现任何迹象表明这两者在幕后运作方面存在任何显着差异(如果我错了,请纠正我 - 我很想知道)。然而,第二种方法(使用对象字面量表示法)提供了一些优点。
考虑一个包含成员 Name 和 TelNo 的新对象。使用 new Object() 约定,我们可以像这样创建它:
var obj1 = new Object();
obj1.Name = "A Person";
obj1.TelNo = "12345";
JavaScript的Expando 属性功能允许我们以这种方式动态创建新成员,并且我们实现了预期目的。但是,这种方式不是很结构化或封装。如果我们想在创建时指定成员,而不必依赖于 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/)
在我使用 Node.js 的机器上,我运行了以下命令:
console.log('Testing Array:');
console.time('using[]');
for(var i=0; i<200000000; i++){var arr = []};
console.timeEnd('using[]');
console.time('using new');
for(var i=0; i<200000000; i++){var arr = new Array};
console.timeEnd('using new');
console.log('Testing Object:');
console.time('using{}');
for(var i=0; i<200000000; i++){var obj = {}};
console.timeEnd('using{}');
console.time('using new');
for(var i=0; i<200000000; i++){var obj = new Object};
console.timeEnd('using new');
请注意,这是此处内容的扩展:为什么 arr = [] 比 arr = new Array 快?
我的输出如下:
Testing Array:
using[]: 1091ms
using new: 2286ms
Testing Object:
using{}: 870ms
using new: 5637ms
很明显 {} 和 [] 比使用 new 创建空对象/数组更快。
这里的每个人都在谈论两者的相似之处。我要指出不同之处。
Usingnew Object()
允许您传递另一个对象。显而易见的结果是新创建的对象将被设置为相同的引用。这是一个示例代码:
var obj1 = new Object();
obj1.a = 1;
var obj2 = new Object(obj1);
obj2.a // 1
用法不限于 OOP 对象中的对象。其他类型也可以传递给它。该函数将相应地设置类型。例如,如果我们将整数 1 传递给它,则会为我们创建一个类型为 number 的对象。
var obj = new Object(1);
typeof obj // "number"
new Object(1)
如果向其添加属性,则使用上述方法 ( )创建的对象将转换为对象类型。
var obj = new Object(1);
typeof obj // "number"
obj.a = 2;
typeof obj // "object"
如果对象是对象子类的副本,我们可以在不进行类型转换的情况下添加属性。
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