javascript創建對象的幾種模式

来源:http://www.cnblogs.com/yezi-dream/archive/2016/05/06/5465578.html
-Advertisement-
Play Games

在js中有幾種模式可以創建對象,通過對象操作所包含的屬性與方法。 一般來說,構造函數名稱的第一個字母為大寫字母,非構造函數名稱的第一個字母為小寫字母,當然,構造函數與一般函數唯一的區別隻是調用的方式不同而已,所以任何函數只要通過new來調用,那它就可以作為構造函數,若不通過new來調用,則與一般函數 ...


     在js中有幾種模式可以創建對象,通過對象操作所包含的屬性與方法。

    一般來說,構造函數名稱的第一個字母為大寫字母,非構造函數名稱的第一個字母為小寫字母,當然,構造函數與一般函數唯一的區別隻是調用的方式不同而已,所以任何函數只要通過new來調用,那它就可以作為構造函數,若不通過new來調用,則與一般函數一樣。

   談談我對這幾種模式的理解:

           工廠模式:創建一個一般函數,在函數里創建一個Object對象,為這個對象增添屬性與方法,同時賦予其值,最後返回對象。無法識別對象類型。

           構造函數模式:創建構造函數,使用this來賦值,每當創建一個實例時,方法都被創建一次,而每個方法都執行相同的命令,這就多餘了。這個缺點可以通過將方法放到全局環境中,但是,這樣就沒有封裝性了。不過可以通過原型模式解決。

          原型模式:每個函數都有一個prototype屬性,該屬性是一個指針,指向一個對象,該對象包含其函數創建的所有實例共用的屬性與方法。

                           原型對象,構造函數以及實例之間的關係如下圖:

                                                

                圖解:1:構造函數以及由構造函數創建的實例,它們的prototype屬性都指向構造函數的原型對象。

                          2:構造函數的原型對象具有constructor屬性,該屬性指向構造函數。

                          3:構造函數的原型對象所包含的所有屬性與方法可以被由構造函數所創建的所有實例共用。

         使用對象字面量重寫原型對象後,constructor則指向object構造函數,若需要其指向另一構造函數,則需修改原型對象的constructor屬性的值,比如:constructor:Person,這樣Person的原型對象即使被重寫,原型對象的constructor仍指向Person構造函數。

         當先創建實例時:若是直接添加屬性或方法,實例可以訪問。

                                      若是重寫原型對象,則構造函數的prototype指向新的原型對象,而之前創建的實例的prototype仍指向最初的原型對象,所以實例訪問不到新的原型對象的新屬性或和新方法。

        原型對象包含的是共用的屬性與方法,那麼每個實例都擁有這些信息,這樣實例之間就沒有什麼不同了,而且還不可以傳參數,這不是我們所想要的。每個實例之間有共同的信息,又有不同的信息,所以我們可以組合使用構造函數模式與原型模式。

             構造函數模式與原型模式的組合使用:

                           

               動態原型模式:將獨立的構造函數與其原型對象結合在一起,在構造函數里初始化原型,為其添加方法。

                            

             若該方法不存在,則將其添加到原型對象上,只在初始化原型時才執行,而且只執行一次。

       寄生構造函數模式:與工廠模式類似,區別為:寄生構造函數模式為構造函數,通過new來創建實例。

       穩妥構造函數模式:沒有公共的屬性,其方法不引用this的對象。創建實例時不使用new。只能通過方法訪問屬性(即傳入的數據)。

 

 

 

 

 

      


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 做了一個作業,用JavaScript列印正倒直線,突然覺得自己還是邏輯有待加強訓練啊 做了一個作業,用JavaScript列印正倒直線,突然覺得自己還是邏輯有待加強訓練啊 document.write("<h3>列印倒正金字塔直線</h3>");//列印一個h3標簽,內容是裡邊的文字 var i= ...
  • 前面的話 數學表達式calc()是CSS中的函數,主要用於數學運算。使用calc()為頁面元素佈局提供了便利和新的思路。本文將介紹calc()的相關內容 定義 數學表達式calc()是calculate計算的縮寫,它允許使用+、-、*、/這四種運算符,可以混合使用%、px、em、rem等單位進行計算 ...
  • 1.viewport 能優化移動瀏覽器的顯示。如果不是響應式網站,不要使用initial-scale或者禁用縮放。大部分4.7-5寸設備的viewport寬設為360px;5.5寸設備設為400px;iphone6設為375px;ipone6 plus設為414px。 <meta name=”vie ...
  • ...
  • 基本語法: 區分大小寫: ECMAScript 中的一切(變數,函數名和操作符)都區分大小寫。 標識符: 表示符就是指,變數,函數,屬性名字,或者函數的參數。 1.第一個字元必須是一個字母,下劃線(_)或美元符號($). 2.其他字元可以是字母,下劃線(_),美元符或數字。 註意:格式為,匈牙利命名 ...
  • Jquery中重置表單的錯誤姿勢 $('#yigeform').reset() 正確姿勢 $('#yigeform')[0].reset() ...
  • 摘要 在各種BS架構的應用程式中,往往都希望服務端能夠主動地向客戶端推送各種消息,以達到類似於郵件、消息、待辦事項等通知。 往BS架構本身存在的問題就是,伺服器一直採用的是一問一答的機制。這就意味著如果客戶端不主動地向伺服器發送消息,伺服器就無法得知如何給客戶端推送消息。 隨著HTML、瀏覽器等各項 ...
  • DIV+CSS 清除浮動是頁面佈局中常見的問題,相信各位高手也都有自己的方法,今天在這裡對常見的幾種方法進行總結(PS:談不上是原創,這裡是我自己做的歸納總結,也是我自己內化的過程),希望對您能夠有所幫助。感謝博客園平臺! 來自<一隻有夢想的前端小白> DIV+CSS 浮動效果是指,父元素在未定義高 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...