电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:105日期: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
相關文章:
主站蜘蛛池模板: 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 设计圈 - 让设计更有价值!| 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 热处理温控箱,热处理控制箱厂家-吴江市兴达电热设备厂 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 重庆私家花园设计-别墅花园-庭院-景观设计-重庆彩木园林建设有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 999范文网_优质范文下载写作帮手| 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 北京开源多邦科技发展有限公司官网 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 |