<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
很多工友們都說:設計模式根本用不到,然而它其實時刻就在我們身邊,像王國維所說:眾裡尋他千百度,驀然回首,那人正在燈火闌珊處。
什麼是工廠模式?其實就字面意思,在現實社會生活中,市場通過不同工廠加工成不同的產品。
轉化成 JS 程式碼就是這樣的:
// 汽車工廠 function carFactory(brand, price, district) { let o = new Object(); o.brand= brand; o.price= price; o.district= district; o.performance= function() { console.log(this.brand); }; return o; } // 生產汽車 let car1 = carFactory("Benz", 50, "china"); let car2= carFactory("Honda", 30, "usa");
// 糖果工廠 function candyFactory(name, size, color) { let o = new Object(); o.name= name; o.size= size; o.color= color; o.performance= function() { console.log(this.name); }; return o; } // 生產糖果 let candy1= candyFactory("Oreo", "small", "white"); let candy2= candyFactory("quduoduo", "middle", "black");
有汽車工廠,糖果工廠等等,我們通過工廠函數,建立了特定物件。
工廠模式是一種眾所周知的設計模式,廣泛應用於軟體工程領域,用於抽象建立特定物件的過程。
建構函式是用於建立特定型別物件的,可以自定義建構函式,以函數的形式為自己的物件型別定義屬性和方法。
比如前面的例子,就可以該寫為:
// 構造汽車的建構函式 function Car(brand, price, district) { this.brand= brand; this.price= price; this.district= district; this.performance= function() { console.log(this.brand); }; } // 構造汽車 let car1 = new Car("Benz", 50, "china"); let car2= new Car("Honda", 30, "usa");
與工廠模式的區別是,建構函式模式:
建構函式首字母通常是大寫;
這裡涉及到一個重要的考點:即使用 new 會發生什麼?
官方解答:
(1) 在記憶體中建立一個新物件。 (2) 這個新物件內部的[[Prototype]](隱式原型)特性被賦值為建構函式的 prototype (顯示原型)屬性。 (3) 建構函式內部的 this 被賦值為這個新物件(即 this 指向新物件)。 (4) 執行建構函式內部的程式碼(給新物件新增屬性)。 (5) 如果建構函式返回非空物件,則返回該物件;否則,返回剛建立的新物件。
這個,就是“原型鏈”的構造過程!!
car1.__proto__===Car.prototype // true car1 instanceof Car // true
建構函式的主要問題在於,其定義的方法會在每個範例上都建立一遍。
什麼意思?用程式碼來解釋:
// 構造汽車的建構函式 function Car(brand, price, district) { this.brand= brand; this.price= price; this.district= district; this.performance= function() { }; } // 構造汽車 let car1 = new Car("Benz", 50, "china"); let car2= new Car("Honda", 30, "usa"); car1.performance == car2.performance // false
即使是同樣的方法,也不相等,因為每次執行 new 的時候,範例的方法都是重新建立的;
原型模式可以解決建構函式模式“重複建立方法”的問題。
// 原型建立 function Car(brand, price, district) { Car.prototype.brand= brand; Car.prototype.price= price; Car.prototype.district= district; Car.prototype.performance= function() { }; } let car1 = new Car("Benz", 50, "china"); let car2= new Car("Honda", 30, "usa"); car1.performance === car2.performance // true
這裡不妨再重溫一下原型鏈的指向關係:
car1.__proto__===Car.prototype // true Car.__proto__===Function.prototype // true Function.prototype.__proto__===Object.prototype //true Car.prototype.__proto__===Object.prototype //true Object.prototype.__proto__===null // true
原型模式弱化了向建構函式傳遞初始化引數的能力,會導致所有範例預設都取得相同的屬性值。
function Person() {} Person.prototype = { constructor: Person, friends: "A", sayName() { } }; let person1 = new Person(); let person2 = new Person(); person1.friends="B"; person1.friends // 'B' person2.friends // 'A'
function PersonArr() {} PersonArr.prototype = { constructor: PersonArr, friends:["A"], sayName() { } }; let person1 = new PersonArr(); let person2 = new PersonArr(); person1.friends.push("B"); person1.friends // ["A","B"] person2.friends // ["A","B"]
原型上的所有屬性是在範例間共用的,這對函數來說比較合適。對原始值的屬性 也還好,但對於參照值的屬性,則會產生混亂!!
工廠模式、建構函式模式、原型模式,這三者沒有誰好誰壞,使用時,更多的是講究一個 —— 適合!只有清楚它們的原理,才能遊刃有餘。
更多關於JS建立物件設計模式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45