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