簡體   English   中英

使用帶有和不帶有“ new”的構造函數創建對象

[英]Creating an object using a constructor with and without `new`

我注意到我可以使用構造函數以兩種不同的方式創建相同的對象。

var myObj = Object()

var myObj = new Object()

我可以使用這些方法向兩者添加屬性。 myObj.age = 1myObj['age'] = 1 兩者的屬性可以相同的方式訪問。

那么我創建myObj這兩種方式之間的實際區別是什么? 這些方法也是創建對象的更好方法之一嗎?

不同之處在於,第一個函數只是在window對象的范圍內將Object()作為函數調用。

第二個實際上實例化了一個新對象。 這是您要用來創建對象的對象。

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 = {};

第一條語句是函數調用,這意味着myObj將獲得Object()函數中返回的任何內容。 碰巧的是,函數Object()將為您提供對Object對象的引用,而“普通”構造函數則不會。

請參閱以下內容:

function O(){
  this.bla= "bla";
  return this;
}

在這里調用O()將產生對window的引用,而不是O的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM