創建對象
通過Object構造函數或對象字面量創建單個對象
這些方式有明顯的缺點:使用同一個接口創建很多對象,會產生大量的重復代碼。為了解決這個問題,出現了工廠模式。
工廠模式
考慮在ES中無法創建類(ES6前),開發人員發明了一種函數,用函數來封裝以特定接口創建對象的細節。(實現起來是在一個函數內創建好對象,然后把對象返回)。
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 0;}var person1=createPerson("Nicholas",29,"Software Engineer");var person2=createPerson("Greg",27,"Doctor");構造函數模式
像Object和Array這樣的原生構造函數,在運行時會自動出現在執行環境。此外,也可以創建自定義的構造函數,從而定義自定義對象類型的屬性和方法。
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); };}var person1=new Person(...);var person2=new Person(...);與工廠模式相比,具有以下特點:
構造函數的問題:
構造函數內部的方法會被重復創建,不同實例內的同名函數是不相等的。可通過將方法移到構造函數外部解決這一問題,但面臨新問題:封裝性不好。
原型模式
我們創建的每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。(prototype就是通過調用構造函數而創建的那個對象實例的原型對象)。
使用原型對象的好處是可以讓所有對象實例共享它所包含的屬性和方法。換句話說,不必在構造函數中定義對象實例的信息,而是可以將這些信息直接添加到原型對象中。
function Person(){}Person.prototype.name="Nicholas";Person.prototype.age=29;Person.prototype.job="...";Person.prototype.sayName=function(){ ...};var person1=new Person();person1.sayName();//"Nicholas"更常見的做法是用一個包含所有屬性和方法的對象字面量來重寫整個原型對象,并重設constructor屬性。
function Person(){}Person.prototype={ name:"...", age:29, job:"...", sayName:function(){ ... }};Object.defineProperty(Person.prototype,"constructor",{ enumerable:false, value:Person,});原型對象的問題:
他省略了為構造函數傳遞初始化參數這一環節,結果所有實例在默認情況下都將取得相同的屬性值,雖然這會在一定程度帶來一定的不便,但不是最大的問題,最大的問題是由其共享的本性所決定的。
新聞熱點
疑難解答
圖片精選