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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...