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. 返回新對象
- 還沒有人評論,歡迎說說您的想法!