ecma-262 把物件定義為:「無序屬性的集合,其屬性可以包含基本值、物件或者函式。」
建立物件最簡單的方式就是建立乙個object例項,然後給這個例項加上屬性與方法,如:
var person=new object()
person.name='小紅'
person.run=function()
發展到以後,程式設計師為了減輕工作量,建立物件開始使用字面量的方式,如:
var person=
}
這樣很多程度減少了程式設計師的工作量,但是呢,這樣的方式如果建立很多個類似的物件,那麼程式設計師要一遍又一遍的建立,豈不是很麻煩,所以懶惰的程式設計師想出了一種建立物件的方式:工廠模式(1)
function person(name)
return o
} var p1=person('小紅')
這樣就可以以一種封裝的工廠模式建立物件,但是呢,。工廠模式雖然解決了建立多個相似物件的問題,但卻沒有解決物件識別的問題(即怎樣知道乙個物件的型別),嚴謹的程式設計師當然不會讓這種事情發生,所以又出現了一種模式,也就是最常用的建立物件的模式:建構函式模式(2)
function person(name) ;
}var p1 = new person('小紅')
var p2 = new person('小黑')
這樣就可以比較完美的建立物件了,但是呢,每例項化乙個物件,裡面的方法在每個例項都要建立一遍方法,比如p1,p2他們都有run這個方法,而這個方法是在他們例項化,都要建立的,兩個例項就是兩遍,100個例項就是100遍,這樣顯然不符合效能的要求,於是,我們能不能把這些復用的方法放在建構函式外面?於是又出現了一種原型模式(3)
function person(name)
person.prototype.run=function()
person.prototype.eat=function()
var p1 = new person('小紅')
這種模式幾乎可以滿足我們的建立物件的需求了,但是的懶惰的程式設計師會在宣告原型方法的時候一遍又一遍的person.prototype…嗎??應該是不可能的,於是它們又開始嘗試簡化原型宣告:
person.prototype=,
run:function()
}
這樣簡化了重複寫person.prototype的問題,但是叕叕出問題啦,每個例項都有乙個constructor屬性,如果不用上述方式,那麼例項的constructor屬性指向的是對應的建構函式,如果使用上述方式,因為我們使用的方式,相當於重寫了prototype,那麼例項的constructor屬性指向的是object,如果你真的很在乎constructor返回值,那麼可以這樣寫:
person.prototype=,
run:function()
}
這樣constructor就可以指向我們的建構函式了,但是叕叕叕叕出現問題了(保證最後一次),使用上述的方式以後,由於我們重新設定了constructor屬性,所以constructor的特性的[[enumerable]]會被設定為true,enumerable是資料屬性,表示能否通過 for-in 迴圈返回屬性。一般來說constructor的預設資料屬性是不可以通過 for-in 迴圈返回屬性的,所以最好加:
object.defineproperty(person.prototype, 「constructor」, );
你以為這樣建立物件就很完美了???soo young!
js建立物件的五種方式
方式一 object建構函式模式 套路 先建立空的object物件,在動態新增屬性 方法 適用場景 起始不確定物件內部資料 缺點 語句太多 var p new object p.name tom p.age 18 p.setname function name 方式二 物件字面量模式 套路 使用 建...
js 建立物件的6種方式
字面式建立物件var person new 操作符 object 建立物件var person newobject person.name lisi person.age 21 person.family lida lier wangwu person.say function 以上兩種方法在使用同...
JS建立物件方式
一 物件 對個資料的封裝體,儲存多個資料的容器 可以統一管理多個資料 1 分類 1 內建物件 由es標準定義的物件,在任何es的實現都可以使用 例如 math string number function object 2 宿主物件 由js執行環境提供的物件 例如 dom bom 3 自定義物件 使...