摘要:工廠模式用函數(shù)來封裝,以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。缺點(diǎn)不能知道對(duì)象識(shí)別的問題對(duì)象的類型不知道。復(fù)雜的工廠模式定義是將其成員對(duì)象的實(shí)列化推遲到子類中,子類可以重寫父類接口方法以便創(chuàng)建的時(shí)候指定自己的對(duì)象類型。
工廠模式
1.創(chuàng)建對(duì)象用函數(shù)來封裝,以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。
function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.showName = function(){ console.log(this.name); } return o; } var p1 = createPerson("Mike", 20, "student"); var p2 = createPerson("Tom", 23, "student"); // 返回都是object 無法識(shí)別對(duì)象的類型 不知道他們是哪個(gè)對(duì)象的實(shí)列 console.log(typeof p1); // object console.log(typeof p2); // object console.log(p1 instanceof Object); // true
輸出如圖:
函數(shù)能夠根據(jù)接收的參數(shù)來構(gòu)建一個(gè)包含所有信息的Person對(duì)象。
可以無數(shù)次地調(diào)用createPerson()這個(gè)函數(shù),每次它都會(huì)返回一個(gè)包含三個(gè)屬性、一個(gè)方法的對(duì)象。
工廠模式是為了解決多個(gè)類似對(duì)象聲明的問題;也就是為了解決實(shí)列化對(duì)象產(chǎn)生重復(fù)的問題。
優(yōu)點(diǎn):能解決多個(gè)相似的問題。
缺點(diǎn):不能知道對(duì)象識(shí)別的問題(對(duì)象的類型不知道)。
復(fù)雜的工廠模式定義是:將其成員對(duì)象的實(shí)列化推遲到子類中,子類可以重寫父類接口方法以便創(chuàng)建的時(shí)候指定自己的對(duì)象類型。
2.觀察實(shí)例對(duì)象的構(gòu)成// 觀察p1對(duì)象的構(gòu)成 console.log(p1); console.log("-----分割線-----"); // 觀察p1對(duì)象的構(gòu)成 console.log(p2); console.log("-----分割線-----"); // 修改p1對(duì)象的屬性,并不會(huì)影響到p2對(duì)象的屬性,因?yàn)樗麄兪呛瘮?shù)createPerson()兩個(gè)獨(dú)立的實(shí)例對(duì)象 p1.age = 21; console.log(p1.age); //21 console.log(p2.age); //23 console.log("p1 === p2:"); console.log(p1 === p2);
輸出如圖:
// 對(duì)象是沒有prototype屬性的 console.log("p1.prototype="); console.log(p1.prototype); console.log("-----分割線-----"); // p1對(duì)象本質(zhì)上是o對(duì)象,即由Object構(gòu)造函數(shù)生成,所以其__proto__屬性指向Object.prototype console.log("p1.__proto__="); console.log(p1.__proto__); console.log("-----分割線-----"); // 驗(yàn)證 console.log("p1.__proto__ === Object.prototype:"); console.log(p1.__proto__ === Object.prototype); console.log("-----分割線-----"); console.log("p1.__proto__ === p2.__proto__:"); console.log(p1.__proto__ === p2.__proto__); console.log("-----分割線-----");
輸出如圖:
console.log("p1.showName.prototype="); console.log(p1.showName.prototype); console.log("-----分割線-----"); console.log("p1.showName.prototype.constructor="); console.log(p1.showName.prototype.constructor); console.log("-----分割線-----"); console.log("p1.showName.prototype.__proto__="); console.log(p1.showName.prototype.__proto__); console.log(p1.showName.prototype.__proto__ === Object.prototype); console.log("-----分割線-----"); console.log("p1.showName.__proto__="); console.log(p1.showName.__proto__); console.log(p1.showName.__proto__ === Function.prototype); console.log("-----分割線-----");
輸出如圖:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78979.html
摘要:創(chuàng)建對(duì)象與工廠模式的區(qū)別沒有顯示地創(chuàng)建對(duì)象直接將方法和屬性付給了對(duì)象沒有語句構(gòu)造函數(shù)應(yīng)該始終以一個(gè)大寫字母開頭。創(chuàng)建構(gòu)造函數(shù)的實(shí)例,必須使用操作符。 構(gòu)造函數(shù)模式 ECMAScript中的構(gòu)造函數(shù)可用來創(chuàng)建特定類型的對(duì)象,像Object和Array這樣的原生構(gòu)造函數(shù)。也可以創(chuàng)建自定義的構(gòu)造函數(shù),從而定義自定義對(duì)象類型的屬性和方法。 1.創(chuàng)建對(duì)象 function Person(name...
摘要:對(duì)象是由構(gòu)造函數(shù)創(chuàng)建而成的,所以它的指向原型鏈圖對(duì)象的原型鏈圖對(duì)象屬性引用的匿名函數(shù)的原型鏈圖 Object模式 創(chuàng)建一個(gè)Object實(shí)例,再為其添加屬性和方法。 這是創(chuàng)建自定義對(duì)象最簡單的方式。 1.創(chuàng)建對(duì)象 // 創(chuàng)建person對(duì)象 var person = new Object(); person.name = Mike; person.age = 20; person.jo...
摘要:組合使用構(gòu)造函數(shù)模式和原型模式構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。創(chuàng)建對(duì)象組合使用構(gòu)造函數(shù)模式和原型模式指向構(gòu)造函數(shù),這里要將其恢復(fù)為指向構(gòu)造函數(shù)。另外,這種混合模式,還支持向構(gòu)造函數(shù)傳遞參數(shù)。 組合使用構(gòu)造函數(shù)模式和原型模式 構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。 創(chuàng)建自定義類型的最常見方式,就是組合使用構(gòu)造函數(shù)模式和原型模式。 ...
摘要:原型模式定義構(gòu)造函數(shù),在構(gòu)造函數(shù)的原型對(duì)象中定義對(duì)象的屬性和方法,并通過構(gòu)造函數(shù)創(chuàng)建對(duì)象。,屬性存在于實(shí)例對(duì)象中,屬性不存在于實(shí)例對(duì)象中分割線操作符會(huì)在通過對(duì)象能夠訪問給定屬性時(shí)返回,無論該屬性是存在于實(shí)例中還是原型中。 原型模式 定義構(gòu)造函數(shù),在構(gòu)造函數(shù)的原型對(duì)象中定義對(duì)象的屬性和方法,并通過構(gòu)造函數(shù)創(chuàng)建對(duì)象。 1.創(chuàng)建對(duì)象 function Person(){}; Person....
摘要:起因構(gòu)造函數(shù)對(duì)象字面量都可以用來創(chuàng)建單個(gè)對(duì)象,但有明顯缺點(diǎn)使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建自定義類型的最常見方式,就是組合使用構(gòu)造函數(shù)模式與原型模式。 寫在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的作者和譯者。有發(fā)現(xiàn)什么問題...
閱讀 3015·2021-10-12 10:12
閱讀 3068·2021-09-22 16:04
閱讀 3300·2019-08-30 15:54
閱讀 2612·2019-08-29 16:59
閱讀 2926·2019-08-29 16:08
閱讀 878·2019-08-29 11:20
閱讀 3502·2019-08-28 18:08
閱讀 660·2019-08-26 13:43