自用備忘筆記安全
前言函數
雖然可使用 Object 和對象字面量建立對象,可是若是要建立大量類似的對象又顯得麻煩。爲解決這個問題,人們開始使用工廠模式的變種。學習
工廠模式this
function person(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function() { alert(this.name); }; return o; } var person1 = person('Nicholas', 29), person2 = person('Greg', 27);
優勢:解決了建立多個類似對象的問題spa
缺點:沒有解決對象識別的問題,即不知道生成對象是什麼類型。prototype
構造函數模式設計
function Person(name, age) { this.name = name; this.age = age; this.sayName = function() { alert(this.name); }; } var person1 = new Person('Nicholas', 29), person2 = new Person('Greg', 27);
優勢:解決了對象識別的問題,經過對象能夠知道它是由哪一個構造函數生成的。code
person1.constructor == Person //true person1 instanceof Person //true person1 instanceof Object //true
缺點:會在每一個實例對象上生成方法,沒有達到複用的效果。對象
person1.sayName == person2.sayName; //false
經過 new 操做符會經歷如下 4 個步驟:1. 建立一個新對象;2. 將構造函數的做用域賦給新對象;3. 執行構造函數中的代碼;4. 返回新對象。blog
原型模式
function Person() {} Person.prototype.name = 'Nicholas'; Person.prototype.age = 29;
Person.prototype.friends = ['Shelby', Court]; Person.prototype.sayName = function() { alert(this.name); }; var person1 = new Person();
優勢:原型對象上的屬性和方法都可以複用。
缺點:引用類型屬性被共享,沒法傳參數自定義實例對象的屬性。
var person1 = new Person(), person2 = new Person(); person1.friends.push('Van'); console.log(person2.friends); //Shelby, Court, Van
組合模式
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayName = function() { alert(this.name); }; var person1 = new Person('Nicholas', 29);
優勢:集合了構造函數模式和原型模式的優勢,是最普遍承認的模式。
缺點:構造函數和原型對象的初始化分開書寫,對有類概念語言的學習者不友好。
動態原型模式
function Person(name, age) { this.name = name; this.age = age; if (typeof this.sayName == 'function') return; Person.prototype.sayName = function() { alert(this.name); } } var person1 = new Person('Nicholas', 29);
優勢:將原型對象的初始化放入構造函數內部,是最理想的模式。經過檢測(任一)方法是否存在,來避免重複對原型對象初始化。
寄生構造函數模式
function Person(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function() { alert(this.name); }; return o; } var person1 = new Person('Nicholas', 29);
缺點:與工廠模式類似,只是經過 new 操做符調用構造函數。與工廠模式同樣,沒法解決對象識別的問題,不推薦使用。
穩妥構造函數模式
穩妥對象是指沒有公共屬性,並且方法也不引用 this 的對象。
function Person(name, age) { var o = new Object(); o.sayName = function() { alert(name); }; return o; } var person1 = Person('Nicholas', 29);
優勢:適用於禁止使用 this 和 new 的場景,安全性高,適合某些安全要求高的環節;屬性未綁定在實例對象上,只能經過特色方法訪問。
缺點:一樣沒法識別對象類型。
參考:《高級程序設計(第3版)》