<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JavaScript創建對象的方式

西西 ? 2018-02-22 09:32 ? 次閱讀

JavaScript中有幾種創建對象的方式,本文將一一介紹,工廠模式、構造函數模式、原型模式、動態原型模式、組合使用構造函數模式和原型模式。

傳統的創建對象的方式:

1、創建Object的實例

JavaScript創建對象的方式

2、對象字面量形式創建單個對象

JavaScript創建對象的方式

創建對象的五種設計模式

1、工廠模式

雖然Object構造函數和對象字面量都可以用來創建單個對象,但這個方式有個明顯的缺點:使用同一個接口創建很多對象,會產生大量重復的代碼。為了解決這個問題,開始使用工廠模式。

JavaScript創建對象的方式

2、構造函數模式

工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即不知道對象的類型),于是,又出現了構造函數模式,自定義的構造函數意味著將來可以把它的實例識別為一種特定的類型。這是構造函數模式勝過工廠模式的地方。

JavaScript創建對象的方式

構造函數模式與工廠模式的不同之處在于:1)沒有顯式地創建對象;2)直接將屬性和方法賦給了this對象;3)沒有return語句。

構造函數的問題:每個方法都要在每個實例上重新創建一遍。由于JavaScript中的函數是對象,每定義一個函數,就是實例化了一個Funtion對象,因此,使用構造函數創建的每個實例都有一個名為showName()的方法,但這些方法不是同一個Function的實例。不同實例上的同名函數是不相等的,因此person1.showName == person2.showName返回false。

可以通過把函數定義轉移到構造函數外部來解決這個問題,如下:

JavaScript創建對象的方式

這樣雖然解決了方法多次創建問題,但又出現了新的問題:

(1)在全局作用域中定義的函數實際上只能被某個對象調用,這讓全局作用域名不副實。

(2)如果對象需要定義很多方法,那么就需要定義很多個全局函數,那么就毫無封裝性可言了。

這些問題可以通過使用原型模式來解決。

3、原型模式

每個函數都以一個原型prototype屬性,是一個指針,指向一個對象。

使用原型對象的好處是可以讓所有對象實例共享它所包含的屬性和方法。也就是說,不必在構造函數中定義對象實例的信息,而是可以直接將這些信息添加到原型對象中。

JavaScript創建對象的方式

使用原型模式創建的新對象具有相同的屬性和方法。與構造函數模式不同的是,新對象的這些屬性和方法是由所有對象所共享的。這會導致所有實例默認有一樣的屬性值,因此person1.showName == person2.showName返回true。

讀取某個對象的某個屬性的搜索方法:

1)首先在實例中搜索,若找到指定屬性,則返回該屬性的值。

2)否則繼續搜索指針指向的原型對象。

使用delete 實例名。屬性名可以刪除實例的某一屬性。

使用hasOwnProperty()方法可以判斷屬性是存在于實例中,還是存在于原型中。只有給定屬性存在于實例中,才會返回true。

in操作符會在通過對象能夠訪問給定屬性時返回true,無論該屬性存在于實例中還是原型中。

同時使用hasOwnProperty()方法和in操作符,能夠確定屬性到底是存在于對象中,還是存在于原型中。

JavaScript創建對象的方式

原型模式更簡單的語法:以一個包含所有屬性和方法的對象字面量來創建原型對象。

JavaScript創建對象的方式

用對象字面量來創建原型對象的結果相同,只是constructor屬性不再指向Person。這是由于這樣已經完全重寫了默認的prototype對象,因此constructor屬性也就變成了新對象的constructor屬性,指向Object構造函數但不指向Person函數。此時,instanceof操作符還能返回正確的結果但通過constructor已經無法確定對象的類型了。

JavaScript創建對象的方式

如果constuctor的值很重要,可以特意將其設置回適當的值。

JavaScript創建對象的方式

重寫原型對象切斷了現有原型與任何之前已經存在的對象實例之間的聯系,對象實例引用的仍然是最初的原型。

JavaScript創建對象的方式

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

原型對象的問題:最大問題是由于共享屬性導致的。原型中所有屬性是被實例共享的,這對于函數很合適,對那些包含基本值的屬性也還說得過去,因為可以通過在實例上添加同名屬性,隱藏原型中的對應屬性。然而,對于包含引用值的屬性來說,問題就比較突出了,修改某個實例的引用類型的屬性也會通過原型影響到其它實例的該屬性。

創建自定義類型的最常見方法是組合使用構造函數模式和原型模式,構造函數模式用于定義實例屬性,原型模式用于定義方法和共享的屬性。

JavaScript創建對象的方式

5、動態原型模式

動態原型模式把所有信息都封裝在了構造函數中,而通過在構造函數中初始化原型,又保持了同時使用構造函數和原型的優點。

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

如:只在showName()方法不存在的情況下,才會將它添加到原型中,這段代碼只會在初次調用構造函數時才會執行。

JavaScript創建對象的方式

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 對象
    +關注

    關注

    1

    文章

    38

    瀏覽量

    17294
  • javascript
    +關注

    關注

    0

    文章

    511

    瀏覽量

    53441
收藏 人收藏

    評論

    相關推薦

    JavaScript權威指南 pdf 下載

    JavaScript權威指南(第四版)全面介紹了JavaScript語言的核心,以及Web瀏覽器中實現的遺留和標準的DOM。它運用了一些復雜的例子,說明如何處理驗證表單數據、使用cookie、創建
    發表于 12-08 10:46

    JavaScript中的Object

    1. 對象的定義?向對象的語?都有一個標志,即類。定義:對象JavaScript 的一個基本數據類型,是?種復合值,它將很多值(原始值或者其他
    發表于 09-18 09:05

    請問如何通過創建窗口對象方式實現界面切換?

    如何通過創建窗口對象方式實現界面切換?
    發表于 04-19 07:48

    JavaScript 【1】 基礎數據類型

    Boolean;var cars=new Array;var person= new Object; JavaScript 變量均為對象。當您聲明一個變量時,就創建了一個新的對象。
    發表于 07-17 10:32

    JavaScript 【2】對象

    (), 它會返回函數的定義:實例objectName.methodName有多種方式可以創建,使用和修改 JavaScript 對象。同樣也有多種
    發表于 07-17 10:33

    JavaScript【8】JSON

    ;www.taobao.com"} ]} JSON 格式化后為 JavaScript 對象JSON 格式在語法上與創建 JavaScript 對象
    發表于 07-17 10:45

    java如何創建對象的分析

    作為Java開發者,我們每天創建很多對象,但我們通常使用依賴管理系統,比如Spring去創建對象。然而這里有很多創建
    發表于 09-27 14:36 ?0次下載

    實例分析Java中創建對象

    Java中有5種創建對象方式,下面給出它們的例子還有它們的字節碼 Paste_Image.png 如果你運行了末尾的的程序,你會發現方法1,2,3用構造函數創建
    發表于 09-28 13:29 ?0次下載

    javascript原型和原型鏈有什么特點

    要弄清楚原型鏈就要先弄清楚 function 類型,在javascript中沒有類的概念,都是函數,所以它是一門函數式的編程語言。類有一個很重要的特性,就是它可以根據它的構造函數來創建以它為模板的對象。在
    發表于 12-05 09:42 ?7179次閱讀
    <b class='flag-5'>javascript</b>原型和原型鏈有什么特點

    使用JavaScript創建對象的方法和案例

    Javascript中的一切幾乎都是對象,無論是數組還是函數。本文將教你使用JavaScript創建對象的三種方法。
    的頭像 發表于 07-06 09:41 ?2738次閱讀

    JavaScript中動態的創建QML對象

    在實際QML應用開發中,我們可以在JavaScript中動態的創建QML對象。這樣做可以延遲對象的實例化,當我們在需要創建
    的頭像 發表于 09-01 10:42 ?1306次閱讀

    Java中創建對象有哪些方式

    1 問題 作為Java開發者,經常創建很多對象,你是否知道Java中創建對象有哪些方式呢?
    的頭像 發表于 02-24 10:29 ?868次閱讀

    Java反射技術實現對象創建

    創建對象,什么時候我們改用反射創建對象呢? 兩者創建對象的效率又是如何呢? ? //new?
    的頭像 發表于 05-22 14:25 ?1624次閱讀
    Java反射技術實現<b class='flag-5'>對象</b>的<b class='flag-5'>創建</b>

    python創建文件對象

    2.1. 創建文件對象 **open() 函數用于創建文件對象,基本語法格式如下:** open(文件名[,打開方式]) 注意: 如果只是文
    的頭像 發表于 06-21 17:19 ?1119次閱讀
    python<b class='flag-5'>創建</b>文件<b class='flag-5'>對象</b>

    javascript的內置對象有哪些

    你全面了解JavaScript的能力和應用場景。 一、基本數據類型對象: String(字符串對象):用于處理和操作文本數據。 Number(數字對象):用于處理和操作數字數據。 Bo
    的頭像 發表于 12-03 11:39 ?806次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>