本文實例講述了JavaScript創建對象方法。分享給大家供大家參考,具體如下:
最簡單的方式就是創建一個Object對象,并為其添加屬性和方法。
//示例代碼var person=new Object()person.name="yumi"person.age=18person.job="coder"person.sayName=function(){ alert(this.name)}person.sayName()//輸出yumi這種方式使用同一個接口創建多個對象,會出現大量重復代碼。
1.工廠模式
JavaScript中無法創建類,我們可以用函數來封裝以特定接口創建對象的細節。
//示例代碼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("yumi",18,"coder");var person2=createPerson("echo",21,"player");person1.sayName();//輸出yumiperson2.sayName();//輸出echo工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別問題,即怎樣知道一個對象的類型。
2.構造函數模式
可以創建自定義的構**造函數,從而定義自定義對象類型的屬性和方法。
//示例代碼function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(name); }}var person1=new Person("yumi",18,"coder");var person2=new Person("echo",21,"player");person1.sayName();//輸出yumiperson2.sayName();//輸出echo創建出的對象既是Object的實例,也是Person的實例,也就是說將來我們可以將它的實例標識為特定類型,這也是優于工廠模式的地方。但是構造函數模式也有缺點,即就是每實例化一個對象,對象方法都會創建一遍,我們可以按如下方法稍加改進:
//示例代碼function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName;}function sayName(){ alert(name);}var person1=new Person("yumi",18,"coder");var person2=new Person("echo",21,"player");person1.sayName();person2.sayName();將函數拿到構造函數外部,構造函數內部將sayName屬性設成全局sayName函數(一般單獨的函數名存放的是指向該函數的指針,而函數名加括號為該函數的執行結果)。但這樣做,暴露出的問題是:全局作用域中定義的函數只能被某一個對象調用,不符合全局定義了。而且,如果某個對象有很多方法,這些方法都定義在全局作用域的話,也就沒什么封裝性可言了。
3.原型模式
前面我們說了,構造函數模式的缺點是屬性或方法在構造函數作用域中只能被某個對象調用,想想我們在其他面向對象語言中的處理方式,是將公用的屬性方法定義在父類中,然后通過繼承父類調用。但是JavaScript中不存在類、繼承這些概念,而是通過原型鏈實現“繼承”。
下面就是我們要說的原型模式:
//示例代碼function Person(){ Person.prototype.name"yumi"; Person.prototype.age=18; Person.prototype.job=coder; Person.prototype.sayName=function(){ alert(name); }}var person1=new Person();var person2=new Person();person1.sayName(); //"yumi"person2.sayName(); //"yumi"alert(person1.sayName==person2.sayName); //true無論什么時候,只要創建了一個新函數,就會為該函數創建一個prototype屬性。默認情況下,所有prototype屬性都會自動獲得一個constructor(構造函數)屬性。這個屬性包含一個指向prototype屬性所在函數的指針。也就是說,Person可以理解為一個類(實際是個函數),Person.prototype指向原型(原型中定義的方法或屬性可以被對象調用,相當于一個共享區域),然后Person.prototype.constructor又指向了Person。實例化的對象有一個內部屬性可以指向Person.prototype,但是不能指向構造函數constructor,跟其無關。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.VeVB.COm/code/HtmlJsRun測試上述代碼運行結果。
更多關于JavaScript相關內容還可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
新聞熱點
疑難解答