// 工廠函數模式 // 沒法解決對象識別問題 function person0(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; return obj; } // --------------------------------------------------- // 構造函數模式 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; // 這個方法實例化時,會建立兩次 this.sayName = function() { alert(this.name); }; } const person1 = new Person("test1", 19, "pig"); const person2 = new Person("test2", 19, "dog"); // --------------------------------------------------- // 原型模式 // 初始化時沒法自定義屬性 function Person1() {} Person1.prototype.name = "looyulong"; Person1.prototype.age = age; Person1.prototype.job = job; Person1.sayName = function() { alert(this.name); }; // --------------------------------------------------- // 組合構造函數模式 // 構造函數定義屬性,原型模式定義方法 function Per(name, age, job) { this.name = name; this.age = age; this.job = job; } Per.prototype = { constructor: Per, sayName: function() { alert(this.name); } }; const per1 = new Per("test1", 19, "pig"); const per2 = new Per("test2", 19, "dog"); // --------------------------------------------------- // 動態構造模式 // 就是加了一個判斷,判斷原型上面是否有對應的方法 function Person2(name, age, job) { this.name = name; this.age = age; this.job = job; if (typeof this.sayName !== "function") { Person2.prototype.sayName = function() { alert(this.name); }; } } // --------------------------------------------------- // 寄生構造函數模式 // 在構造函數的內部返回一個對象,也就是new的時候返回一個對象 // 與工廠函數其實沒有很大區別,只是在寫法上,工廠函數建立對象須要執行一個函數 // 經過這種模式,能夠達到和工廠函數相同的效果,可是倒是用new操做符調用的 function Person3(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; obj.sayName = function() { alert(this.name); alert(obj.name); }; return obj; } // --------------------------------------------------- // 穩妥構造函數模式 // 沒有公共屬性,沒有公共屬性,不用this // 由於有些環境沒法是用this和new function Person4(name, age, job) { var obj = new Object(); obj.getName = function() { return name; }; obj.getAge = function() { return age; }; obj.getJob = function() { return job; }; obj.sayName = function() { alert(name); }; return obj; }