java script創建對象_JavaScript七種非常經典的創建對象方式

JavaScript創建對象的方式有很多,通過Object構造函數或對象字面量的方式也可以創建單個對象,顯然這兩種方式會產生大量的重復代碼,并不適合量產。接下來介紹七種非常經典的創建對象的方式,他們也各有優缺點。

一、工廠模式可以無數次調用這個工廠函數,每次都會返回一個包含兩個屬性和一個方法的對象。工廠模式雖然解決了創建多個相似對象的問題,但是沒有解決對象識別問題,即不能知道一個對象的類型。

961bb48cc251d3d61e050a26833cb1ef.png

二、構造函數模式沒有顯示的創建對象,使用new來調用這個構造函數,使用new后會自動執行如下操作:①創建一個新對象;②將構造函數的作用域賦給新對象(因此this就指向了這個新對象);③執行構造函數中的代碼(為這個新對象添加屬性);④返回新對象。

751bf6bc0bf1a938dcef6147b806801d.png

缺點:每個方法都要在每個實例上重新創建一遍。創建兩個完成同樣任務的的Function實例的卻沒有必要。況且有this對象在,根本不用在執行代碼前就把函數綁定到特定的對象上,可以通過這樣的形式定義:

d9c0ff0de3b51d10c3d5a3f5ca3958f6.png

如此一來,就可以將sayName()函數的定義轉移到構造函數外部。而在構造函數內部,我們將sayName屬性設置成全局的sayName函數。這樣的話,由于sayName包含的是一個指向函數的指針,因此person1和person2對象就可以共享在全局作用域中定義的同一個sayName()函數。這樣做解決了兩個函數做同一件事的問題,但是新的問題又來了:在全局作用域中定義的函數實際上只能被某個對象調用,這讓全局作用域有點名不副實。而更重要的是:如果對象需要定義很多方法,那么就需要定義很多個全局函數,這樣一來,我們自定義的這個引用類型就毫無封裝性可言了。

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

27b66d90c853b11720bab37882f94119.png

①理解原型無論什么時候,只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個prototype屬性。在默認情況下,所有prototype屬性都會自動獲得一個constructor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針。每當代碼讀取某個對象的某個屬性時,都會執行一搜索,目標是具有給定名字的屬性。搜索首先從對象實例本身開始。如果在實例中找到了具有給定名字的屬性,則返回該屬性的值;如果沒有找到,則繼續搜索指針指向的原型對象,在原型對象中查找具有給定名字的屬性。如果在原型對象中找到了這個屬性,則返回該屬性的值。雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加了一個屬性,而該屬性與實例中的一個屬性同名,那么就會在實例中創建該屬性,該屬性將會屏蔽原型中的那個屬性。即使是將屬性設置為null,也只是在實例中的屬性值為null。不過,使用delete操作符可以完全刪除實例屬性,從而能夠重新訪問原型中的屬性。使用hasOwnProperty()方法可以檢測一個屬性是存在于實例中,還是存在與原型中。這個方法只在給定屬性存在于對象實例中時,才會返回true。

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

4593f8fdb94e1cf8e4fd4e35fcd2e19a.png

在上面的代碼中,將Person.prototype設置為等于一個以對象字面量形式創建的新對象。最終結果相同,但有一個例外:constructor屬性不再指向Person。

四、組合使用構造函數模式和原型模式是使用最為廣泛、認同度最高的一種創建自定義類型的方法。它可以解決上面那些模式的缺點,使用此模式可以讓每個實例都會有自己的一份實例屬性副本,但同時又共享著對方法的引用,這樣的話,即使實例屬性修改引用類型的值,也不會影響其他實例的屬性值了。還支持向構造函數傳遞參數,可謂是集兩種模式的優點。

894603f46ff6cbc132176ee42f6a9c38.png

五、動態原型模式將所有信息都封裝在了構造函數中,初始化的時候。可以通過檢測某個應該存在的方法是否有效,來決定是否需要初始化原型。

bfadf294ea0a3c128be62692341e3ed7.png

只有在sayName方法不存在的時候,才會將它添加到原型中。這段代碼只會初次調用構造函數的時候才會執行。此后原型已經完成初始化,不需要在做什么修改了,這里對原型所做的修改,能夠立即在所有實例中得到反映。其次,if語句檢查的可以是初始化之后應該存在的任何屬性或方法,所以不必用一大堆的if語句檢查每一個屬性和方法,只要檢查一個就行。

六、寄生構造函數模式的基本思想就是創建一個函數,該函數的作用僅僅是封裝創建對象的代碼,然后再返回新建的對象除了使用new操作符并把使用的包裝函數叫做構造函數之外,和工廠模式幾乎一樣。構造函數如果不返回對象,默認也會返回一個新的對象,通過在構造函數的末尾添加一個return語句,可以重寫調用構造函數時返回的值。

7a6515f210c2a47d9541edc310c045de.png

七、穩妥構造函數模式首先明白穩妥對象指的是沒有公共屬性,而且其方法也不引用this。穩妥對象最適合在一些安全環境中(這些環境會禁止使用this和new),或防止數據被其他應用程序改動時使用。穩妥構造函數模式和寄生模式類似,有兩點不同:1.是創建對象的實例方法不引用this;2.不使用new操作符調用構造函數

d3b8a357898ccf86a4c5e798b39959d7.png

跟寄生構造函數模式一樣,這樣創建出來的對象與構造函數之間沒有什么關系,instanceof操作符對他們沒有意義。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 方法 示例_Java掃描儀具有示例的NextNextInt()方法

java 方法 示例掃描器類的hasNextInt()方法 (Scanner Class hasNextInt() method) Syntax: 句法: public boolean hasNextInt();public boolean hasNextInt(int rad);hasNextInt() method is available in java.util package. hasNextInt()方法在java.util包中可用…

axis2開發webservice之編寫Axis2模塊(Module)

axis2中的模塊化開發。能夠讓開發者自由的加入自己所需的模塊。提高開發效率,減少開發的難度。 Axis2能夠通過模塊(Module)進行擴展。Axis2模塊至少須要有兩個類,這兩個類分別實現了Module和Handler接口。開發和使用一個Axis2模塊…

java 看書瀏覽器官_JAVA讀取文件流,設置瀏覽器下載或直接預覽操作

最近項目需要在瀏覽器中通過url預覽圖片。但發現瀏覽器始終默認下載,而不是預覽。研究了一下,發現了問題:// 設置response的header,注意這句,如果開啟,默認瀏覽器會進行下載操作,如果注釋掉&…

Java PriorityQueue poll()方法與示例

PriorityQueue類poll()方法 (PriorityQueue Class poll() method) poll() method is available in java.util package. poll()方法在java.util包中可用。 poll() method is used to return the first element with removing an element from this PriorityQueue. poll()方法用于…

scrapy抓取淘寶女郎

scrapy抓取淘寶女郎 準備工作 首先在淘寶女郎的首頁這里查看,當然想要爬取更多的話,當然這里要查看翻頁的url,不過這操蛋的地方就是這里的翻頁是使用javascript加載的,這個就有點尷尬了,找了好久沒有找到,這里如果有朋…

map在Java集合_java集合之Map

MapMap用于保存具有映射關系的數據。Map中key不允許重復,value可以重復,key和value之間存在單向一對一關系HashMap和Hashtable區別1 Hashtable線程安全、HashMap線程不安全,所以HashMap性能高一點2 Hashtable不允許用null做key和value&#x…

Java OutputStream close()方法與示例

OutputStream類close()方法 (OutputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this OutputStream stream and free all system resources linked with this stream and …

怎樣在fastboot 里面加入新的命令

fastboot 是android 默認的一種debug 方法。它的優點是在進入linux kernel 之前就可以操作。默認fastboot 支持的命令&#xff1a; usage: fastboot [ <option> ] <command>commands: update <filename> reflash device …

java編寫字符串連接程序注釋_Java 注解自動化處理對應關系實現注釋代碼化

public class EsQuery { private static int DEFAULT_SIZE 100; private final Map termFilter;private final Map rangeFilter;private final Map matchFilter;private int size;private String orderBy null;private String order null; // query 查詢語法, 是否需要 filtere…

getlanguage_Java語言環境getLanguage()方法與示例

getlanguage區域設置類getLanguage()方法 (Locale Class getLanguage() method) getLanguage() method is available in java.util package. getLanguage()方法在java.util包中可用。 getLanguage() method is used to retrieve this Locale language code and the language co…

[轉]Anaconda

安裝 Anaconda Anaconda 可用于 Windows、Mac OS X 和 Linux。可以在 https://www.continuum.io/down... 上找到安裝程序和安裝說明。 如果計算機上已經安裝了 Python&#xff0c;這不會有任何影響。實際上&#xff0c;腳本和程序使用的默認 Python 是 Anaconda 附帶的 Python。…

win10 iot core java_Windows 10 IoT Core 正式版初體驗

今天收到Windows 10 IoT Core Team郵件&#xff0c;Windows 10 IoT Core正式發布。以下記錄了今天在Raspberry Pi 2上的體驗過程&#xff1a;準備工作一臺運行著正版Windows 10且版本不小于10240的個人PCVisual Studio 2015 版本不小于14.0.23107.0 D14Rel Install Visual Stud…

filterwriter_Java FilterWriter flush()方法與示例

filterwriterFilterWriter類flush()方法 (FilterWriter Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush out the string from this FilterWriter stream. flush()方法用于從此Filter…

VUE2 第五天學習--過渡效果

閱讀目錄 1.理解VUE---過渡效果回到頂部1.理解VUE---過渡效果 1. 過渡的-css-類名會有4個(css) 類名在 enter/leave 在過渡中切換。1. v-enter: 進入過渡的開始狀態。在元素被插入時生效&#xff0c;在下一個幀移除。2. v-enter-active: 進入過渡的結束狀態。在元素被插入時生效…

java 集合addall_Java集合的addAll()方法和示例

java 集合addall集合類的addAll()方法 (Collections Class addAll() method) addAll() Method is available in java.lang package. addAll()方法在java.lang包中可用。 addAll() Method is used to put all the given elements(ele) to the given collection (co). addAll()方…

國家可持續發展議程創新示范區創建工作推進會在北京召開

2019獨角獸企業重金招聘Python工程師標準>>> 為推進地方申報國家可持續發展議程創新示范區相關工作&#xff0c;根據國家可持續發展議程創新示范區創建工作的進展及需求&#xff0c;2017年4月23日—25日&#xff0c;科技部社會發展科技司、中國21世紀議程管理中心在…

java控制臺打印圖片_java——控制臺輸入打印圖形

1. 打印直角三角形需求說明&#xff1a;從控制臺輸入直角三角形的高度(行數)。每行*的數目依次為1、3、5、7等。實現思路&#xff1a;外層循環控制行數&#xff0c;根據用戶輸入的行數得到外層循環條件分析每行打印的內容&#xff1a;每一行均打印*號&#xff0c;第i行的*號數為…

Java日歷compareTo()方法與示例

日歷類的compareTo()方法 (Calendar Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two Calendar objects or in other words, we can say this method is u…

在struts2中配置自定義攔截器放行多個方法

源碼&#xff1a; 自定義的攔截器類&#xff1a; //自定義攔截器類:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;im…

java多態和泛型_Java面向對象(二) 接口、多態和泛型

一、接口二、多態多態是同一個行為具有多個不同表現形式或形態的能力。2.1 類型轉換轉換方式隱式 向上轉型對于基本數據類型&#xff0c;存儲容量低的可自動向存儲容量高的類型轉換對于引用變量&#xff0c;子類可被轉換為超類&#xff0c;可被賦給所屬類實現的接口的引用顯式 …