我注意到我可以用两种不同的方式使用构造函数创建相同的对象。
var myObj = Object()
var myObj = new Object()
我可以使用这些方法为两者添加属性。 myObj.age = 1
和myObj['age'] = 1
。两者的属性可以相同的方式加入。
那么我创建myObj
的这两种方式之间的实际差异是什么?这也是创建对象的更好方法之一吗?
答案 0 :(得分:4)
不同之处在于,第一个只是在Object()
对象的范围内调用window
作为函数。
第二个实际实例化一个新对象。这是您要用来创建对象的那个。
使用Object()
函数可能并不明显,但是假设您创建了自己的类型,如下所示:
function User(name) {
this.name = name;
}
var u1 = User("John");
var u2 = new User("Jane");
console.log(u1); // *undefined* because `User()` doesn't return anything.
console.log(this.name); // John
console.log(window.name); // John
console.log(u2.name); // "Jane"
Object
函数本身就是一种特殊情况 - 它确实创建了一个新的Object。但是由于大多数函数不能以这种方式工作,所以养成在实例化事物时使用new
关键字的习惯是很好的。另一方面,如果你只是创建一个普通的Object
,大多数人都更喜欢更简洁的语法:
var myObj = {};
答案 1 :(得分:2)
第一个语句是 function 调用,这意味着myObj
将获得Object()
函数中返回的任何内容。碰巧,函数Object()
将为您提供对Object
对象的引用,而'normal'构造函数则不会。
见f.e.以下内容:
function O(){
this.bla= "bla";
return this;
}
在此处调用O()
会产生对window
的引用,而不会引用O
的实例。