本文實例講述了JavaScript實現創建自定義對象的常用方式。分享給大家供大家參考,具體如下:
對象字面量方式是創建自定義對象的首選模式,簡單方便。
var per = { name:'zhangsan', age:25, job:'html', sayName:function(){ alert(this.name); }}缺點:使用同一個接口創建很多對象,會產生大量的重復代碼。比如我想再創建一個per1對象,我就得把上面的代碼再重新寫一遍,改變不同的屬性值。
工廠模式抽象了創建具體對象的過程。由于在ECMAScript中無法創建類,開發人員就發明了一種函數,用函數來封裝以特定接口創建對象的細節,如下面的例子:
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o;}var person1 = createPerson('zhang',30,'java');var person2 = createPerson('zhao',25,'php');函數createPerson()能夠根據接受到的參數來構建一個包含所有必要信息的Person對象。可以無數次的調用這個函數,而每次它都會返回一個包含三個屬性和一個方法的對象。
缺點:工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。
可以使用構造函數模式將前面的例子重寫如下:
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }}var person1 = new Person('zhang',30,'java');var person2 = new Person('zhao',25,'php');創建自定義的構造函數意味著將來可以將它的實例標識為一種特定的類型。而這正是構造函數模式勝過工廠模式的地方。
然而,使用構造函數的主要問題,就是每個方法都要在每個實例上重新創建一遍。在上面的例子中,person1和person2都有一個名為sayName()的方法,但那兩個方法不是同一個Function的實例,創建兩個完成同樣任務的Function實例的確沒有必要;況且有this對象在,根本不用在執行代碼前就把函數綁定到特定對象上面。因此可以像下面這樣,通過把函數定義轉移到構造函數外部來解決這個問題。
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = sayName();}function sayName(){ alert(this.name);}var person1 = createPerson('zhang',30,'java');var person2 = createPerson('zhao',25,'php');在這個例子中,我們把sayName()函數的定義轉移到構造函數外部。而在構造函數內部,我們將sayName屬性設置成等于全局的sayName函數,這樣person1和person2對象就共享了在全局作用域中定義的同一個
新聞熱點
疑難解答
圖片精選