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

您的位置:首頁技術文章
文章詳情頁

詳解js中的幾種常用設計模式

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

工廠模式

function createPerson(name, age){ var o = new Object(); // 創建一個對象 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)

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

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

構造函數模式

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(構造函數)屬性指向Person。這正是構造函數模式勝過工廠模式的地方。如下:

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

構造函數模式與工廠模式的區別:

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

要創建Person的新實例,必須使用new操作符。以這種方式調用構造函數實際上會經歷一下4個步驟:

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

構造函數的問題:

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

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)}

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

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

原型模式

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

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

原型模式的問題:

它省略了為構造函數傳遞參數初始化參數的環節,結果所有的實例在默認情況下都將取得相同的屬性值。另外,原型模式的最大問題是由其共享的本性所導致的。看如下問題:

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

帶來的新問題:

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

組合使用構造函數模式和原型模式

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

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

這種構造函數與原型混成的模式,是目前ECMAscript中使用最廣泛、認同度最高的一種創建自定義類型的方法。可以說,這是用來定義引用類型的一種默認方式。

動態原型模式

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

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()方法不存在的情況下,才會將它添加到原型中。這段代碼只會在初次調用構造函數時才會執行。注意:

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

其它模式

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

以上就是詳解js中的幾種常用設計模式的詳細內容,更多關于JS 設計模式的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品婷婷| 久久国产电影| 久久精品不卡| 美女网站视频一区| 久久三级视频| 免费精品国产的网站免费观看| 欧美丝袜一区| 亚洲精品一区三区三区在线观看| 国产欧洲在线| 中文字幕在线高清| 欧美国产美女| 三级在线看中文字幕完整版| xxxxx性欧美特大| 精品国产aⅴ| 久久精品人人| 91精品一区二区三区综合| 国产91精品对白在线播放| 蜜臀91精品国产高清在线观看| 国产一区欧美| 好看的av在线不卡观看| 好吊视频一区二区三区四区| 国产一在线精品一区在线观看| 欧美日韩一二三四| 久久大逼视频| 国产探花一区| 日本一区二区免费高清| 亚洲高清成人| 丝袜美腿亚洲色图| 亚洲另类av| 久久99精品久久久野外观看| 亚洲精品永久免费视频| 欧美中文一区二区| 蜜桃视频免费观看一区| 欧美一区二区三区久久精品| 精品久久久久久久| 免费黄色成人| 日韩精品第一| 久久精品午夜| 一区久久精品| 欧美偷窥清纯综合图区| 精品国产午夜| 99日韩精品| 欧美国产中文高清| 久久人人97超碰国产公开结果| 亚洲一区二区网站| 麻豆一区在线| 不卡视频在线| 日韩欧美激情| 人人精品亚洲| 久久狠狠亚洲综合| 韩国精品主播一区二区在线观看 | 国产精品成久久久久| 亚洲一级黄色| 国产精品伦理久久久久久| 亚洲一区欧美二区| 国产精品尤物| 亚洲一本视频| 国产精品亚洲人成在99www| 久久精品中文| 青草综合视频| 国产精品7m凸凹视频分类| 久久99性xxx老妇胖精品| 亚洲欧美久久久| 色一区二区三区四区| 日本欧美在线看| 色一区二区三区四区| 日韩精选在线| 亚洲先锋成人| 精品久久不卡| 日本中文字幕视频一区| 亚洲成av在线| 欧美黑人巨大videos精品| 老牛国产精品一区的观看方式| 国产不卡一区| 国产丝袜一区| 蜜臀av一区二区在线免费观看 | 桃色一区二区| 国产激情欧美| 免费看黄色91| 性欧美xxxx免费岛国不卡电影| 国产精品毛片久久久| 欧美午夜不卡影院在线观看完整版免费| 久久不卡日韩美女| 亚洲精品黄色| 夜夜嗨网站十八久久| 亚洲综合在线电影| 精品72久久久久中文字幕| 欧美在线看片| 亚洲人亚洲人色久| 自拍日韩欧美| 视频福利一区| 日韩精品2区| 老司机免费视频一区二区三区| 综合精品一区| 亚洲欧美日韩国产一区| 精品中文一区| 欧美日韩尤物久久| 日韩av在线中文字幕| 久久中文精品| 日韩高清在线观看一区二区| 每日更新成人在线视频| 午夜国产一区二区| 亚洲天堂成人| 亚洲婷婷免费| 99视频精品全国免费| 日本精品在线中文字幕| 桃色av一区二区| 天堂√中文最新版在线| 国产a久久精品一区二区三区| 国产精品久久| 麻豆精品在线| 国产精品一区二区精品视频观看 | 999久久久亚洲| 亚洲日本网址| 深夜视频一区二区| 香蕉视频亚洲一级| 亚洲天堂免费电影| 日韩av首页| 久久蜜桃精品| av一区二区高清| 在线视频免费在线观看一区二区| 国产综合精品一区| 精品一区在线| 国产精品普通话对白| 丝袜国产日韩另类美女| 蜜桃久久精品一区二区| 亚洲精品九九| 国产精品一区二区av日韩在线| 国产精品欧美三级在线观看| 美女久久久久久| 日韩电影免费网址| 激情久久久久久久| 麻豆9191精品国产| 日韩av中文字幕一区二区| 国产精品一区2区3区| 国产精品二区不卡| 欧美aa一级| 婷婷成人在线| 三级欧美韩日大片在线看| 欧美影院精品| 精品一区二区三区在线观看视频| av免费不卡国产观看| 久久美女性网| 午夜国产欧美理论在线播放| 免费久久精品视频| 国产精品一区亚洲| 国产不卡人人| 日韩亚洲国产欧美| 日韩精品久久久久久久软件91| 国产精品色婷婷在线观看| 四季av一区二区凹凸精品| 日韩国产欧美| 影音国产精品| 97成人在线| 日韩av有码| 中文一区在线| 国产精品最新| 香蕉成人av| 天堂成人国产精品一区| 国产亚洲电影| 久久国产电影| 日本h片久久| 中文字幕在线官网| 亚洲资源av| 国产精品一区高清| 视频小说一区二区| 日韩av三区| 国产不卡精品| 久久亚洲欧美| 精品国产精品国产偷麻豆| 不卡中文字幕| 国产精品综合| 欧美色图一区| 97精品资源在线观看| 午夜精品久久久久久久久久蜜桃| 亚洲午夜国产成人| 97精品视频在线看| 亚洲精品美女| 日韩欧美网址| 日产欧产美韩系列久久99| 午夜av不卡| 日韩黄色av| 日韩欧美网址| 欧美影院视频| 在线国产一区二区| 国产免费久久| 黄色av日韩| 精品免费av| 免费在线观看不卡| 日韩福利一区| 欧美日本三区| 欧美成人午夜| 精品伊人久久| 亚州精品视频| 激情久久久久久久| 欧美激情精品| 视频精品一区二区| 国产精品13p| 国产日韩欧美一区在线| 另类国产ts人妖高潮视频|