![](/img/trans.png)
[英]JavaScript: Creating objects based on a prototype without using new + Constructor
[英]Creating an object using a constructor with and without `new`
我注意到我可以使用構造函數以兩種不同的方式創建相同的對象。
var myObj = Object()
var myObj = new Object()
我可以使用這些方法向兩者添加屬性。 myObj.age = 1
和myObj['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.