使用带有和不带`new`的构造函数创建对象

时间:2015-01-24 14:35:12

标签: javascript object

我注意到我可以用两种不同的方式使用构造函数创建相同的对象。

var myObj = Object()

var myObj = new Object()

我可以使用这些方法为两者添加属性。 myObj.age = 1myObj['age'] = 1。两者的属性可以相同的方式加入。

那么我创建myObj的这两种方式之间的实际差异是什么?这也是创建对象的更好方法之一吗?

2 个答案:

答案 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的实例。