寫在前面
這篇文章講解創建對象的各種方式,以及優缺點。
但是注意:
這篇文章更像是筆記,因為《JavaScript高級程序設計》寫得真是太好了!
1. 工廠模式
function createPerson(name) { var o = new Object(); o.name = name; o.getName = function () { console.log(this.name); }; return o;}var person1 = createPerson('kevin');缺點:對象無法識別,因為所有的實例都指向一個原型
2. 構造函數模式
function Person(name) { this.name = name; this.getName = function () { console.log(this.name); };}var person1 = new Person('kevin');優點:實例可以識別為一個特定的類型
缺點:每次創建實例時,每個方法都要被創建一次
2.1 構造函數模式優化
function Person(name) { this.name = name; this.getName = getName;}function getName() { console.log(this.name);}var person1 = new Person('kevin');優點:解決了每個方法都要被重新創建的問題
缺點:這叫啥封裝……
3. 原型模式
function Person(name) {}Person.prototype.name = 'keivn';Person.prototype.getName = function () { console.log(this.name);};var person1 = new Person();優點:方法不會重新創建
缺點:1. 所有的屬性和方法都共享 2. 不能初始化參數
3.1 原型模式優化
function Person(name) {}Person.prototype = { name: 'kevin', getName: function () { console.log(this.name); }};var person1 = new Person();優點:封裝性好了一點
缺點:重寫了原型,丟失了constructor屬性
3.2 原型模式優化
function Person(name) {}Person.prototype = { constructor: Person, name: 'kevin', getName: function () { console.log(this.name); }};var person1 = new Person();優點:實例可以通過constructor屬性找到所屬構造函數
缺點:原型模式該有的缺點還是有
4. 組合模式
構造函數模式與原型模式雙劍合璧。
function Person(name) { this.name = name;}Person.prototype = { constructor: Person, getName: function () { console.log(this.name); }};var person1 = new Person();優點:該共享的共享,該私有的私有,使用最廣泛的方式
缺點:有的人就是希望全部都寫在一起,即更好的封裝性
4.1 動態原型模式
function Person(name) { this.name = name; if (typeof this.getName != "function") { Person.prototype.getName = function () { console.log(this.name); } }}var person1 = new Person();注意:使用動態原型模式時,不能用對象字面量重寫原型
解釋下為什么:
新聞熱點
疑難解答
圖片精選