JavaScript創(chuàng)建對象的幾種方式

1. 簡單方式

可以直接通過new Object() 創(chuàng)建:
var person = new Object()
person.name = 'jack'
person.age = 12

person.sayName = function(){
  console.log(this.name)
} 

每次創(chuàng)建通過new Object() 比較麻煩,所以可以通過它的簡單形式對象字面量來創(chuàng)建

var person = {
  name: "jack",
  age: 18,
  sayName: function(){
    cosnole.log(this.name)
  }
}

對于上面的寫法固然沒有問題,但是如果我們要生成兩個或者對個person實例對象呢?

var person1 = {
  name: "jack",
  age: 18,
  sayName: function(){
    cosnole.log(this.name)
  }
}

var person2 = {
  name: "rose",
  age: 18,
  sayName: function(){
    cosnole.log(this.name)
  }
}

通過上面的代碼我們不難看出,這樣的代碼太過冗余,重復(fù)性太高

2. 簡單方式的改進:工廠函數(shù)

我們可以寫一個函數(shù),解決代碼重復(fù)問題
function createPerson (name,age){
  return {
    name: name,
    age: age,
    sayName: function(){
      console.log(this.name)
    }
  }
}

然后生成實例對象:

var p1 = createPerson('jack',18)
var p2 = createPerson('rose',18)

如上,這樣封裝代碼會少很多,通過工廠模式我們解決了創(chuàng)建多個相似代碼冗余的問題,但是沒有解決對象識別的問題(即怎樣知道一個對象的類型)

3. 構(gòu)造函數(shù)

一種更優(yōu)的工廠函數(shù)就是下面這樣,構(gòu)造函數(shù):

function Person(name,age){
  this.name = name,
  this.age = age,
  this.sayName = function(){
    console.log(this.name)
  }
}

var p1 = new Person('jack',18)

p1.sayName()

var p2 = new Person('rose',18)

p2.sayName()

解析構(gòu)造函數(shù)代碼的執(zhí)行

在上面的示例中,Person()函數(shù)取代了createPerson()函數(shù),但是實現(xiàn)的效果是一樣的,這是為什么呢?
我們可以注意到,Person中代碼與createPerson有以下幾點不同之處:
1. 沒有顯示創(chuàng)建對象
2. 直接將屬性和方法賦給了this對象
3. 沒有return語句
4. 函數(shù)名是大寫的Person
而要創(chuàng)建Person實例,則必須要使用new操作符,以這種方式調(diào)用構(gòu)造函數(shù)會經(jīng)歷以下4個步驟:
1. 創(chuàng)建一個新對象
2. 將構(gòu)造函數(shù)的作用域賦給新對象(因此this指向了這個新對象)
3. 執(zhí)行構(gòu)造函數(shù)中的代碼
4. 返回新對象