日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解js中的幾種常用設(shè)計模式

瀏覽:179日期:2024-05-26 09:22:36

工廠模式

function createPerson(name, age){ var o = new Object(); // 創(chuàng)建一個對象 o.name = name; o.age = age; o.sayName = function(){ console.log(this.name) } return o; // 返回這個對象}var person1 = createPerson(’ccc’, 18)var person2 = createPerson(’www’, 18)

工廠函數(shù)的問題:工廠模式雖然解決了創(chuàng)建多個相似對象的問題,但是沒有解決對象識別問題(即怎樣知道一個對象的類型)。如下

person1 instanceof createPerson // --> falseperson1 instanceof Object // --> true

構(gòu)造函數(shù)模式

function Person(name , age){ this.name = name; this.age = age; this.sayName = function(){ console.log(this.name) }}var person1 = new Person(’ccc’, 18)var person2 = new Person(’www’, 18)person1.sayName() // --> ’ccc’

person1 和person2 分別保存著Person的一個不同的實例。這兩個對象都有一個constructor(構(gòu)造函數(shù))屬性指向Person。這正是構(gòu)造函數(shù)模式勝過工廠模式的地方。如下:

console.log(person1 instanceof Person) // --> trueconsole.log(person1 instanceof Object) // --> trueconsole.log(person2 instanceof Person) // --> trueconsole.log(person2 instanceof Object) // --> true

構(gòu)造函數(shù)模式與工廠模式的區(qū)別:

沒有顯式的創(chuàng)建對象 直接將屬性和方法賦給了this對象 沒有return 語句

要創(chuàng)建Person的新實例,必須使用new操作符。以這種方式調(diào)用構(gòu)造函數(shù)實際上會經(jīng)歷一下4個步驟:

創(chuàng)建一個新對象 將構(gòu)造函數(shù)的作用域賦給新對象(因此this就指向了這個新對象) 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個新對象添加屬性) 返回新對象

構(gòu)造函數(shù)的問題:

使用構(gòu)造函數(shù)的重要問題,就是每個方法都要在每個實例上重新創(chuàng)建一遍。person1和person2中都有一個名為sayName()的方法,但那兩個方法不是同一個Function實例。因為在ECMAscript中函數(shù)就是對象,因此每定義一個函數(shù),也就是實例化了一個對象。從邏輯角度上講,此時的構(gòu)造函數(shù)也可以你這樣定義:

function Person(name , age){ this.name = name; this.age = age; this.sayName = new Function(’console.log(this.name)’) // eslint: The Function constructor is eval. (no-new-func)}

這會導(dǎo)致,創(chuàng)建的不同的實例上的同名函數(shù)是不相等的,比如:console.log(person1.sayName() === person2.sayName()) // -->false,然而創(chuàng)建兩個完全相同的任務(wù)的Function實例是沒有必要的。可以通過把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來解決這個問題。

function Person(name , age){ this.name = name; this.age = age; this.sayName = sayName}function sayName(){ console.log(this.name)}var person1 = new Person(’ccc’, 18)var person2 = new Person(’www’, 18)

這樣,由于sayName包含的是一個指向函數(shù)的指針,因此person1和person2對象就共享了在全局作用域中定義的同一個sayName()函數(shù)。這樣做確實解決了兩個函數(shù)做同一件事的問題,可是新問題又來了:在全局作用域中定義的函數(shù)實際上只能被某個對象調(diào)用,這讓全局作用域有點(diǎn)名不副實。帶來的新問題:如果對象需要定義很多方法,那么就要定義很多個全局函數(shù),于是我們這個自定義的引用類型就絲毫沒有封裝性可言。

原型模式

關(guān)于原型,原型鏈內(nèi)容不在此描述,只討論原型設(shè)計模式我們創(chuàng)建的每一個函數(shù)都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。即不必在構(gòu)造函數(shù)中定義對象實例的信息,而是將這些信息直接添加到原型對象中。

function Person(){}Person.prototype.name = ’ccc’Person.prototype.age = 18Person.prototype.sayName = function(){ console.log(this.name)}var person1 = new Person()person1.sayName() // --> cccvar person2 = new Person()person2.sayName() // --> cccconsole.log(person1.sayName === person2.sayName) // --> true

原型模式的問題:

它省略了為構(gòu)造函數(shù)傳遞參數(shù)初始化參數(shù)的環(huán)節(jié),結(jié)果所有的實例在默認(rèn)情況下都將取得相同的屬性值。另外,原型模式的最大問題是由其共享的本性所導(dǎo)致的。看如下問題:

function Person(){}Person.prototype = { constructor: Person, name: ’ccc’, age: 18, friends:[’www’, ’aaa’], sayName: function () { console.log(this.name) }}var person1 = new Person()var person2 = new Person()person1.friends.push(’bbb’)console.log(person1.friends) // --> ['www', 'aaa', 'bbb']console.log(person2.friends) // --> ['www', 'aaa', 'bbb']console.log(person1.friends === person2.friends) // --> true

帶來的新問題:

如果我們的初衷就是這樣,所有的實例共用一個數(shù)組,那么這個結(jié)果就是想要的。可是,實例一般都是要有屬于自己的全部屬性的,這個問題正是我們很少看到有人單獨(dú)使用原型模式的原因所在。

組合使用構(gòu)造函數(shù)模式和原型模式

創(chuàng)建自定義類型的最常見方式,就是組合使用構(gòu)造函數(shù)模式與原型模式。構(gòu)造函數(shù)模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。

function Person(name, age){ this.name = name; this.age = age; this.friends = [’aaa’, ’bbb’]}Person.prototype = { constructor: Person, sayName: function(){ console.log(this.name) }}var person1 = new Person(’ccc’, 18)var person2 = new Person(’www’, 18)person1.friends.push(’ddd’)console.log(person1.friends) // --> ['aaa', 'bbb', 'ddd']console.log(person2.friends) // --> ['aaa', 'bbb']console.log(person1.friends === person2.friends) // --> falseconsole.log(person1.sayName === person2.sayName) // --> true

這種構(gòu)造函數(shù)與原型混成的模式,是目前ECMAscript中使用最廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類型的方法。可以說,這是用來定義引用類型的一種默認(rèn)方式。

動態(tài)原型模式

動態(tài)原型模式就是可以通過檢查某個應(yīng)該存在的方法是否有效,來決定是否需要初始化原型。

function Person(name, age){ // 屬性 this.name = name this.age = age // 方法 if(typeof this.sayName !== ’function’){ Person.prototype.sayName = function(){ console.log(this.name) } }}var person1 = new Person(’ccc’, 18)person1.sayName() // --> ccc

這里只有在sayName()方法不存在的情況下,才會將它添加到原型中。這段代碼只會在初次調(diào)用構(gòu)造函數(shù)時才會執(zhí)行。注意:

在這里對原型所做的修改,能夠立即在所有實例中得到反映。 使用動態(tài)原型模式時,不能使用對象字面量重寫原型。如果在已經(jīng)創(chuàng)建了實例的情況下重寫原型,那么就會切斷現(xiàn)有實例與新原型之間的聯(lián)系。(參考原型與原型鏈中的內(nèi)容)

其它模式

還有寄生構(gòu)造函數(shù)模式和穩(wěn)妥構(gòu)造函數(shù)模式,可自行了解。以上所以知識內(nèi)容來自《JavaScript高級程序設(shè)計》(第三版)。

以上就是詳解js中的幾種常用設(shè)計模式的詳細(xì)內(nèi)容,更多關(guān)于JS 設(shè)計模式的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
999在线观看精品免费不卡网站| 中文字幕日韩欧美精品高清在线| 亚洲精品国产精品粉嫩| 九九久久国产| 亚洲香蕉视频| 精品一区毛片| 欧美一级鲁丝片| 国产精品黄色片| 欧美激情三区| 国产精品中文| 欧美在线黄色| 日韩高清一区二区| 欧美精品三级在线| 亚洲精品亚洲人成在线观看| 亚久久调教视频| 欧美日韩精品一区二区视频| 午夜欧美视频| 日韩毛片在线| 日韩电影免费网址| 91亚洲成人| 最近高清中文在线字幕在线观看1| 国产尤物精品| 天堂日韩电影| 99久久激情| 国产欧美日韩精品高清二区综合区 | 丝瓜av网站精品一区二区| 日产精品一区二区| 国产一区二区三区四区| 国产在线日韩精品| 精品国产欧美日韩| 精品视频一区二区三区四区五区 | 久久精品国产免费| 国产精品多人| 国产高清日韩| 久久国产直播| 欧美日韩在线二区| 欧美三区四区| 日韩在线观看| 天堂а√在线最新版中文在线| 日韩电影免费在线观看| 国产精品久久久久av电视剧| 天堂√中文最新版在线| 久久九九电影| 亚洲香蕉久久| 欧美精品中文| 精品视频91| 日韩欧美少妇| 婷婷综合成人| 国产精品久久久一区二区| 国产精品日韩精品中文字幕| 欧美交a欧美精品喷水| 国产日韩在线观看视频| 日韩中文视频| 国产精品女主播一区二区三区| 蜜臀av一区二区三区| 91国内精品| 美女国产一区二区三区| 日韩精品诱惑一区?区三区| 不卡中文字幕| 日本一不卡视频| 国产精品对白久久久久粗| 视频一区二区三区在线| 精品入口麻豆88视频| av高清一区| 蜜臀a∨国产成人精品| 国产精品大片| 国产中文字幕一区二区三区| av一区在线| 在线国产一区| 国产精品草草| 亚洲欧美日韩视频二区| 日韩88av| 欧美亚洲免费| 先锋亚洲精品| 神马日本精品| 久久99久久久精品欧美| 亚洲综合另类| 中文字幕系列一区| 国产精品免费99久久久| 一区二区三区四区精品视频| 久久裸体视频| 国产精品三级| 综合五月婷婷| 亚洲精品123区| 成人午夜在线| 国产视频一区二区在线播放| 丝袜国产日韩另类美女| 99久久精品国产亚洲精品| 麻豆精品久久久| 日韩激情精品| 亚洲男女自偷自拍| 久久一区二区三区喷水| 精品一区二区三区四区五区| 日韩欧美三区| 香蕉久久国产| 欧美福利专区| 国产伊人久久| 国产精品亚洲综合在线观看| 免费成人av在线播放| 欧美成人精品| 久久精品亚洲欧美日韩精品中文字幕| 国产精品白丝久久av网站| 日韩欧美美女在线观看| 中文一区一区三区免费在线观 | 日韩精品国产欧美| 91九色精品国产一区二区| 91视频一区| 国产在线一区不卡| 久久精品国产99国产| 欧美亚洲自偷自偷| 日韩av中文字幕一区二区三区| 男人的天堂久久精品| 午夜亚洲精品| 欧美日韩国产在线一区| 日本精品在线中文字幕| 桃色av一区二区| 极品av在线| sm久久捆绑调教精品一区| 久久精品国产网站| 麻豆传媒一区二区三区| 精品一区二区三区中文字幕视频 | 日韩国产91| 日韩国产91| 国产欧美一区二区精品久久久 | 老色鬼久久亚洲一区二区| 91九色精品国产一区二区| 国产精品av久久久久久麻豆网| 99久久夜色精品国产亚洲狼| 欧美日韩色图| 一区二区视频欧美| 久久福利一区| 亚洲精品激情| 国产调教精品| 久久一区亚洲| 亚洲成人av观看| 国产精品99一区二区| 国产国产精品| 蜜桃av一区二区三区电影| 亚洲三级毛片| 日韩精彩视频在线观看| 国产精品资源| 精品国产乱码久久久| 欧美国产美女| 韩日一区二区三区| 老鸭窝毛片一区二区三区| 日韩影片在线观看| 欧美一区91| 国产在线观看91一区二区三区| 欧洲一区二区三区精品| 香蕉成人久久| 欧美日一区二区在线观看| 精品一区二区三区视频在线播放 | 精品国产亚洲日本| 欧美日韩免费观看视频| 一区在线观看| 日日夜夜免费精品| 国产麻豆一区二区三区| 国产成人精品亚洲线观看| 99tv成人| 亚洲欧美久久精品| 免费精品一区| 欧美va亚洲va日韩∨a综合色| 日韩精品一卡二卡三卡四卡无卡| 911亚洲精品| 成人国产精品一区二区网站| 亚洲调教视频在线观看| 日韩精品一级二级| 国产日韩欧美一区二区三区在线观看 | 国产亚洲久久| 午夜av不卡| 爽爽淫人综合网网站| 国产精品白丝一区二区三区| 久久天堂精品| 日韩av午夜在线观看| 色一区二区三区| 亚洲理论在线| 正在播放日韩精品| 亚洲精品韩国| 亚洲综合在线电影| 国产麻豆综合| 精品欧美日韩精品| 欧美精品一卡| 欧美91在线| 亚洲一区成人| 久久av日韩| 亚洲一区二区免费看| 国产精品chinese| 五月婷婷亚洲| 久久丁香四色| 99在线观看免费视频精品观看| 国产精品午夜一区二区三区| japanese国产精品| 久久久久九九精品影院| 丝袜美腿亚洲一区| 久久国产精品美女| 日韩午夜一区| 精品不卡一区| 日韩不卡在线观看日韩不卡视频 | 国产视频一区三区| 电影91久久久|