摘要:解決了構(gòu)造函數(shù)模式不能共享方法的問題。六寄生構(gòu)造模式流程創(chuàng)建一個(gè)構(gòu)造函數(shù),在這個(gè)函數(shù)內(nèi)部創(chuàng)建一個(gè)對象,用返回對象。除了使用操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)以外,這個(gè)模式與工程模式其實(shí)是一模一樣的。
JavaScript面向?qū)ο蟾呒墶獙ο髣?chuàng)建模式 一、工廠模式
流程: 定義一個(gè)函數(shù),函數(shù)返回對象。
適用場景: 需要創(chuàng)建多個(gè)對象,都是Object類型。
優(yōu)點(diǎn):完成了返回一個(gè)對象的要求。
缺點(diǎn): 對象沒有一個(gè)具體的類型,無法通過constructor識別對象, 都是Object類型。多個(gè)實(shí)例的sayName方法都是實(shí)現(xiàn)一樣的效果,但是卻存儲了很多次。
// 1.工廠模式 function createPerson (name, age, job) { // 返回一個(gè)對象的函數(shù)==》工廠函數(shù) // 顯式的創(chuàng)建對象 var o = new Object() o.name = name o.age = age o.job = job o.sayName = function () { alert(this.name) } return o // 返回對象 } var p1 = createPerson("Tom", 12, "student") var p2 = createPerson("Mandy", 22, "teacher") // 或者: function createPerson (name, age, job) { // 返回一個(gè)對象的函數(shù)==》工廠函數(shù) // 顯式的創(chuàng)建對象 var o = { name:name, age:age, job:job, sayName: function () { alert(this.name) } } return o // 返回對象 } var p1 = createPerson("Tom", 12, "student") var p2 = createPerson("Mandy", 22, "teacher"二、.構(gòu)造函數(shù)模式
流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),沒有顯式地創(chuàng)建對象,沒有return語句,通過new操作符創(chuàng)建對象。
使用場景:需要創(chuàng)建多個(gè)類型確定的對象。
優(yōu)點(diǎn):可以通過constructor或者instanceof來識別對象實(shí)例的類型。
缺點(diǎn):多個(gè)實(shí)例的sayName方法都是實(shí)現(xiàn)一樣的效果,但是卻存儲了很多次(兩個(gè)對象實(shí)例的sayName方法是不同的,因?yàn)榇娣诺牡刂凡煌?/p>
function Person (name, age) { this.name = name this.age = age this.sayName = function () { alert(this.name) } } var p1 = new Person("Tony", 14) var p2 = new Person("Bob", 15三、原型模式
流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),給這個(gè)函數(shù)的prototype添加屬性和方法。通過new操作符創(chuàng)建對象。
使用場景:起始時(shí)對象內(nèi)部數(shù)據(jù)是確定的。
優(yōu)點(diǎn):(1)sayName方法是共享的,所有實(shí)例的sayName方法都指向同一個(gè)。(2)可以動態(tài)的添加原型對象的方法和屬性,并直接反映在對象實(shí)例上。
缺點(diǎn):(1)由于p1和p2的name屬性指向同一塊內(nèi)存區(qū)域,因此改變p1.name會導(dǎo)致p2.name改變。(2)所有的方法都是共享的,沒有辦法創(chuàng)建自己的屬性和方法,也沒有辦法像構(gòu)造函數(shù)哪像傳遞參數(shù)。
function Person () {} Person.prototype.name = "Mandy" Person.prototype.age = 16 Person.prototype.sayName = function () { alert(this.name) } var p1 = new Person() var p2 = new Person() p1.sayName() // "Mandy"四、構(gòu)造函數(shù)+原型組合模式
流程:自定義構(gòu)造函數(shù),屬性在函數(shù)中初始化,方法添加到原型上。
適用場景:需要創(chuàng)建多個(gè)類型確定的對象。
優(yōu)點(diǎn):(1)解決了原型模式對于對象引用的問題。(2)解決了原型模式?jīng)]有辦法傳遞參數(shù)的問題。(3)解決了構(gòu)造函數(shù)模式不能共享方法的問題。
function Person (name) { this.name = name } Person.prototype.sayName = function () { console.log(this.name) } var p1 = new Person("Mandy") p1.sayName() // Mandy五、動態(tài)原型模式
流程:創(chuàng)建構(gòu)造函數(shù),在構(gòu)造函數(shù)內(nèi)部初始化屬性,在構(gòu)造函數(shù)內(nèi)部在原型上添加方法。通過new操作符創(chuàng)建對象。
需要創(chuàng)建多個(gè)類型確定的對象。
優(yōu)點(diǎn):(1)可以在初次調(diào)用構(gòu)造函數(shù)的時(shí)候就完成原型對象的修改。(2)對原型對象的修改能在所有的實(shí)例中反映。
缺點(diǎn):紅寶書上說了這個(gè)方案非常完美。
function Person(name, age) { // 屬性 this.name = name this.age = age // 方法 // 判斷sayName方法不存在的情況下,在原型上添加sayName方法。 if(typeof this.sayName != "function") { Person.prototype.sayName = function () { console.log(this.name) } } } var p1 = new Person("Tom") p1.sayName() // "Tom六、寄生構(gòu)造模式
流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),在這個(gè)函數(shù)內(nèi)部創(chuàng)建一個(gè)對象,用return返回對象。通過new操作符創(chuàng)建。
除了使用new操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)以外,這個(gè)模式與工程模式其實(shí)是一模一樣的。
function Person(name, age) { // 將創(chuàng)建對象的代碼封裝在函數(shù)中。 // 顯式創(chuàng)建要返回的對象 var o = new Object() o.name = name o.age = age o.sayName = function () { console.log(this.name) } return o // 返回對象 } var p1 = new Person("Mandy",18)七、穩(wěn)妥構(gòu)造模式
優(yōu)點(diǎn):安全。除了調(diào)用sayName方法外,沒有其他辦法可以訪問name的值。
function Person (name, age) { // 創(chuàng)建要返回的對象 var o = new Object() // 添加方法 o.sayName = function () { console.log(this.name) } // 返回對象 return o } var p1 = new Person("Mandy",20) p1.name // undefined // 除了調(diào)用sayName方法外,沒有其他辦法可以訪問name的值。 p1.sayName() // "Mandy"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105095.html
摘要:個(gè)人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開始萌生寫文章的想法,到著手...
摘要:類類的概念應(yīng)該是面向?qū)ο笳Z言的一個(gè)特色,但是并不像,等高級語言那樣擁有正式的類,而是多數(shù)通過構(gòu)造器以及原型方式來仿造實(shí)現(xiàn)。因此,出現(xiàn)了構(gòu)造函數(shù)方式,它的關(guān)鍵在于構(gòu)造器概念的引入。于是,這就產(chǎn)生了構(gòu)造函數(shù)原型法的類構(gòu)造方法。 類 Class 類的概念應(yīng)該是面向?qū)ο笳Z言的一個(gè)特色,但是JavaScript并不像Java,C++等高級語言那樣擁有正式的類,而是多數(shù)通過構(gòu)造器以及原型方式...
摘要:由于某些字符類非常常用,的正則表達(dá)式中,使用特殊轉(zhuǎn)義字符表示他們。多行搜索代碼示例對象創(chuàng)建對象可以通過引用類型創(chuàng)建正則表達(dá)式對象參數(shù)參數(shù)被稱為模式,可以使任何簡單或復(fù)雜的正則表達(dá)式,包含字符類限定符分組向前查找以及反向引用等。 概述 正則表達(dá)式是什么 正則表達(dá)式(RegularExpression):由一些普通字符和特殊字符組成的,用以描述一種特定的字符規(guī)則的表達(dá)式。正則表達(dá)式常用在一...
摘要:請記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好。看了...
閱讀 2845·2021-10-21 09:38
閱讀 2751·2021-10-11 10:59
閱讀 3022·2021-09-27 13:36
閱讀 1649·2021-08-23 09:43
閱讀 791·2019-08-29 14:14
閱讀 3034·2019-08-29 12:13
閱讀 3203·2019-08-29 12:13
閱讀 310·2019-08-26 12:24