使用對象字面值(object literal)創建對象
在JAVA中,這是創建對象最簡單的方式。語法如下:
var person = {
firstName: 'san',
lastName: 'zhang'
}
使用new關鍵字創建對象
這種創建對象的方式,類似于在其他面向對象的語言中創建對象,如Java。順便說一下,從ES6開始,類在Java中是原生存在的,可以通過定義類來創建對象。使用new關鍵字創建對象,需要一個構造器函數。
使用new關鍵字創建對象,有如下兩種形式:
使用內建的Object構造器函數
創建對象:
var person = new Object
向對象添加屬性:
person.firtName = 'san'
person.lastName = 'zhang'
不推薦使用這種方式創建對象,因為會涉及到作用域解析,Java會去檢測構造器函數是用戶創建的還是系統內建的。
使用用戶定義的構造器函數
使用Object構造器函數創建對象的問題是每次創建完對象,都需要手工去為對象添加屬性。
為了避免每次都需要手工為對象添加屬性,我們可以創建一個自定義函數。首先,我們創建一個構造器函數,然后使用new關鍵字創建對象。
function Person(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
var person = new Person("san", "zhang")
var person1 = new Person("si", "li")
在這種創建對象的方式中,new關鍵字執行了以下步驟:
- 調用函數
- 修改this關鍵字指向,將該函數的this指向一個新對象
- 將新對象的原型(prototype)綁定到函數的原型
代碼說明如下:
// new關鍵字
function Person(name) {
this.name = name
}
var person = new Person("tudouya")
// 等價代碼
var person1 = Object.create(Person.prototype)
原型(Prototype)方法創建對象
使用原型方法創建對象,代碼如下:
function Person{};
Person.prototype.name = "tudouya";
原型和函數結合創建對象
代碼如下:
function Person(name){
this.name = name;
}
Person.prototype.getName = function{
return this.name
}
使用Object.create方法創建對象
使用這種方式創建對象,可以很方便的從一個已經存在的對象創建一個新對象,而不用使用new關鍵字。
Object.create方法基于一個已經存在的對象作為新創建對象的原型。
使用Object.create方法創建對象,只需要記住它需要傳入兩個參數。第一個參數可以是任意一個對象,該對象作為新創建對象的原型。第二個參數是可選參數,類型是對象,該對象包含向新創建對象添加的屬性。
假設有一個班級對象Class:
var classObj = { className: "一班", studentNum: 100 }
現在想為這個班級創建一個學生,可以使用如下方式:
var studentObj = Object.create(classObj, {
studentName: {
value: "小明"
},
studentAge: {
value: 29
}
})
注意第二個參數的寫法
使用Object.assign方法創建對象
假如我們想創建一個擁有一個以上對象的所有屬性的新對象,Object.assign方法可以實現這種目的。
Object.assign方法用來將一個或多個源對象的所有可枚舉的屬性拷貝到一個目標對象中。
Object.assign可以接受任意數量的對象作為參數。第一個參數是他即將創建,并且返回的參數。其余傳入的對象參數,被用來將屬性復制到新對象中。
假設有如下兩個對象:
var orgObj = { company: "Baidu" }
var carObj = { carName: "Kayan" }
現在需要一個在Baidu公司開著Kayan的員工,可以使用如下方式創建對象:
var employee = Object.assign({}, carObj, orgObj)
singleton(單例)方法創建對象
代碼如下:
var person = new function{
this.name = "tudouya"
}
使用ES6 class創建對象
使用ES6 class創建對象與使用用戶定義的函數構造器創建對象方法類似。構造器函數被類替代,因為它遵循ES6規范。
示例如下:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
}
var person = new Person("san", "zhang")