穩妥構造函數模式和工廠模式創建對象有什麼區別?
初學者正在看書,發現樓上各位的 durable constructor 的代碼都不太對。穩妥構造函數模式的代碼應該是這樣的:
function Person(name, age, job) {
var o = new Object();
// private members
var nameUC = name.toUpperCase();
// public members
o.sayName = function() {
alert(name);
};
o.sayNameUC = function() {
alert(nameUC);
};
return o;
}
var person = Person("Nicholas", 32, "software Engineer");
person.sayName(); // "Nicholas"
person.sayNameUC(); // "NICHOLAS"
alert(person.name); // undefined
alert(person.nameUC); // undefined
凡是想設為 private 的成員都不要掛到 Person 返回的對象 o 的屬性上面,掛上了就是 public 的了。
當然,這裡的 private 和 public 都是從形式上類比其他 OO 語言來說的,其實現原理還是 js 中作用域、閉包和對象那一套。感覺實現得挺巧妙的。看懂了穩妥構造函數模式,也就明白了穩妥構造函數模式和工廠模式創建對象的區別。function Process (nameF ) {
var o = new Object();
var name = nameF;
o.sayName = function(){
alert(name);
};
return o;
}
var friend = Process("Nick");
friend.sayName(); //"Nick"
console.log(friend.name);//undefined
搞不懂樓上的思維, 這種才叫做穩妥構造函數好嗎, 這樣才會出現私有變數的形式, 明顯區別與其他。
題主可以看下《javascipt高級程序設計》第6.2章[創建對象]部分,我也是名初學者,回答如有誤請各位大大幫忙指出 ^_^ 。題主想弄清問題需要了解下工廠模式、穩妥構造函數模式與寄生構造函數模式三種方法的差異;工廠模式:
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("Nicholas", 29, "software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
person1.sayName(); //"Nicholas"
person2.sayName(); //"Greg"
var person1 = new createPerson("Nicholas", 29, "software Engineer");
寄生構造函數模式與工廠模式的區別是使用了new操作符把createPerson函數作為構造函數,其實是跟工廠模式一模一樣的。
穩妥構造函數模式:function Person( name, age, job ) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
alert(name); //注意這裡沒有了「this」;
};
return o;
}
var person = Person("Nicholas", 29, "software Engineer");
Person.sayName(); //"Nicholas"
穩妥構造函數採用的是與寄生構造函數模式相似的模式,除了下列兩點不同:
1.創建對象的實例方法不引用this;2.不使用new調用構造函數;所以構造函數適合在禁用this和new的環境中使用(或者說設計的出發點)。
特性:*由於添加方法時去掉了"this",即使修改所創建對象的屬性:person.name = "Greg";
也可以通過sayName方法訪問創建對象時的原始數據:
person.sayName(); //仍為「Nicholas」
給你看個例子穩妥構造函數模式的寫發
function person(name,age,sex){
var o=new Object();
o.sayName=function(){
console.log(name);
}
return o;
}
var haj=person("haj",29,"M");
haj.sayName();
//haj
haj.name="haj1";
haj.sayName();
//haj
console.log(haj.name);
//haj1
上面修改了haj.name的屬性 但是下面的sayName方法並沒有改變值
再看看工廠模式function person(name,age,sex){
var o=new Object();
o.name=name;
o.age=age;
o.sex=sex;
o.sayName=function(){
console.log(this.name);//這裡用了this,sayName方法調用的值會變
}
return o;
}
著就是工廠模式和穩妥構造函數的區別吧!
簡單來說就是調用this.name 建立了一個承接
只有 @lomyal 的回答是對的,不懂為什麼這個答案下好幾個人理解錯誤。
個人覺得 @王大頭的理解是正確的
推薦閱讀:
※Google Polymer是前端組件化的未來!那對於現在當下,又該採用什麼技術實現組件化呢?AngularJs可以勝任嗎?
※如何評價 TypeScript?
※如何在 React 中運用 CSS?
※如何評價Knot.js?
TAG:JavaScript |