標籤:

穩妥構造函數模式和工廠模式創建對象有什麼區別?


初學者正在看書,發現樓上各位的 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 |