JavaScript設計模式:讀書筆記(未完)

来源:http://www.cnblogs.com/thewindsword/archive/2016/04/01/5331799.html
-Advertisement-
Play Games

該篇隨我讀書的進度持續更新閱讀書目:《JavaScript設計模式》 2016/3/30: 模式是一種可復用的解決方案,可用於解決軟體設計中遇到的常見問題./將解決問題的方法製作成模板,並且這些模板可應用於多種不同的情況.有效模式的附加要求:適合性,實用性,適用性. 模式的優點: 防止局部問題引起大 ...


該篇隨我讀書的進度持續更新
閱讀書目:《JavaScript設計模式》

  1. 2016/3/30
  2. 2016/3/31

 

2016/3/30:

模式是一種可復用的解決方案,可用於解決軟體設計中遇到的常見問題./將解決問題的方法製作成模板,並且這些模板可應用於多種不同的情況.
有效模式的附加要求:適合性,實用性,適用性.

模式的優點:

  • 防止局部問題引起大問題,模式讓我們的代碼更有組織性
  • 模式通常是通用的解決方式,不管我們開發哪種應用程式,都可以用模式優化我們代碼的結構
  • 模式確實可以讓我們避免代碼復用,使代碼更整潔
  • 使用模式方便我們與工作伙伴一起工作時進行溝通和交流

優秀模式有以下的特點

  • 解決特殊問題
  • 沒有顯而易見的解決方案-間接提供解決問題的方案
  • 證明瞭作用與描述相一致
  • 描述了一種關係,從正式描述能深入解釋它與代碼關係的系統結構和機制

反模式:

  • 描述一種針對某個特定問題的不良解決方案,該方案會導致糟糕的情況發生
  • 描述如何擺脫前述的糟糕情況以及如何創造好的解決方案

JavaScript中的反模式示例:

  • 在全局上下文中定義大量的變數污染全局命名空間(就是亂使用全局變數)
  • 向setTimeout/setInterval傳遞字元串,這會導致出發eval()的內部使用
  • 修改Object類的原型
  • 內聯形式使用JavaScript,它是不可改變的
  • 濫用document.write

設計模式:
確定->包含的類和實例,它們的角色,協作方式,職責分配

  1. 創建型設計模式
    處理對象創建機制,以適合給定情況的方式來創建對象.旨在通過控制創建過程來解決減少創建對象的基本方法可能導致的項目複雜性
    Constructor(構造器),Factory(工廠),Abstract(抽象),Prototype(原型),Singleton(單例),Builder(生成器)都屬於創建型設計模式.
  2. 結構型設計模式
    找出不同對象之間建立關係的簡單方法,確保系統某一部分發生變化時,系統整個結構不需要同時改變,對於不適合某一特定目的需要改變的系統部分,模式也能幫助進行重組.
    Decorator(裝飾者),Facade(外觀),Flyweight(享元),Adapter(適配器),Proxy(代理)都屬於結構型設計模式.
  3. 行為設計模式
    專註於改善簡化系統中不同對象的通信
    Iterator(迭代器),Mediator(中介者),Observer(觀察者),Visitor(訪問者)都屬於行為設計模式.

2016/3/31:

Constructor(構造器)模式:
<經典OOPL中,Constructor是一種在記憶體已分配給該對象的情況下,用於初始化新創建對象的特殊方法.>
JavaScript中,創建新對象有兩種方法:
1. var newObj = {};
2. var newObj = new Object();
以上兩種方法都創建了空對象.
賦值方法有4種:
newObj.some = "hello world";
newObj["some"] = "hello world";
以上兩種相容ECMAScript3
Object.defineProperty(newObj,"some",{value:"hello world"});//mdn鏈接
Object.defineProperties(newObj,{"some":{value:"hello world"},"other":{value:"goodbye"}});//mdn鏈接
以上兩種方法屬於ECMAScript5

基本構造器:

function people(name,age){
    this.name = name;
    this.age = age;
    this.toString = function(){
      return this.name;
    };
  }
View Code

問題:toString這樣的函數為每個people構造器創建的新對象而重新分別定義了.

帶原型的構造器:

function people(name,age){
  this.name = name;
  this.age = age;
}
people.prototype.toString = function(){
  return this.name;
}
View Code

這樣就可以單一實例在所有people對象之間共用了.

Module(模塊)模式
在JavaScript中,實現模塊的方法:

  • 對象字面量表示法(對象表達式)
  • Module模式
  • AMD模塊
  • CommonJS模塊
  • ECMAScript Harmony模塊

後三種在後面討論,目前學習前兩種

對象字面量表示法:
對象字面量不需要new來實例化,但不能用於語句開頭,這會導致{被解讀為一個塊的開始.對象外部,新成員賦值可以用myModule.property = "Value";
使用對象字面量有助於封裝和組織代碼.

Module(模塊)模式:
Module模式最初定義為一種在傳統軟體工程中為類提供私有和公有封裝的方法.
而在JavaScript中,Module模式用於進一步模擬類的概念.我們通過該方式,能夠使一個單獨的對象擁有公有/私有方法和變數,使函數名與頁面其他腳本定義的函數衝突可能性降低.
JavaScript中沒有真正意義上的"私有",所以我們使用作用域來模擬該概念

//函數字面量
var myMoudle = {
  myProperty:"property",
  myConfig:{
    language:"cn"
  },
  myFunction:function(){
    return "myFunction";
  }
};

//Module mode
var newMoudle = (function() {
  //private
  var innerVar = "test";

  return {
    //publish
    displayInnerVar = function() {
      return innerVar;
    }

  };
})();
View Code

(待續)

 


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

-Advertisement-
Play Games
更多相關文章
  • 本地文件系統如ext3,reiserfs等 (這裡不討論基於記憶體的文件系統),它們管理本地的磁碟存儲資源、提供文件到存儲位置的映射,並抽象出一套文件訪問介面供用戶使用。但隨著互聯網企業的高 速發展,這些企業對數據存儲的要求越來越高,而且模式各異,如淘寶主站的大量商品圖片,其特點是文件較小,但數量巨大 ...
  • HTML5已經成為最流行的編程語言在web開發者。強大的編程語言有很大的能力,生產更好的萬維網內容。HTML5的興起已經在過去三年增長迅速。介紹了HTML5的新技術是更好的。HTML5技術是由像Chrome的瀏覽器,支持Firefox、IE和更多。今天,我們列出了十個HTML5動畫製作工具,可以幫助 ...
  • 最近的工作在做一個多步驟多分步的表單頁面,這個多步驟多分步的意思是說這個頁面的業務是分多個步驟完成的,每個步驟可能又分多個小步驟來處理,大步驟之間,以及小步驟之間都是一種順序發生的業務關係。起初以為這種功能很好做,就跟tab頁的實現原理差不多,真做下來才發現,這裡面的相關邏輯還是挺多的(有可能是我沒... ...
  • “我們正在用HTML5編寫我們下一套移動產品。”“是啊,這些天很多人在玩著Appcelerator,我也在玩著。”“嗯,但這並不是我要說的那種HTML5產品。” 最近,我有很多類似的交流對話,可能因為我正在開發一套HTML5的應用吧。就像2005年的“AJAX”,“HTML5”這個術語現在還沒有被清 ...
  • 前段時間做項目,有個功能是消息提醒。 我相信很多大牛都做過。下麵來分享我遇到的問題和解決方案。 首先我們的項目是用frameset框架,main代碼。 <frameset name="myFrame" cols="85,*" frameborder="no" border="0" framespac ...
  • 即將從事Web前端的工作的 先對即將從事的行業有個瞭解。 Web前端發展史: 第一個網頁誕生於90年代初,早期的網頁除了一些小圖片和毫無佈局可言的標題段落,其全由文字構成。然而隨著時代的進步,互聯網的不斷發展,接下來出現了表格佈局,此次是flash,最後是基於CSS的網頁設計。不可否認,前端頁面重構 ...
  • JavaScript中有三個可以對字元串編碼的函數,分別是: escape,encodeURI,encodeURIComponent,相應3個解碼函數:unescape,decodeURI,decodeURIComponent 。 下麵簡單介紹一下它們的區別 1 escape()函數 定義和用法es ...
  • 前面的話:JavaScript可運行在所有主要平臺的主流瀏覽器上,也可運行在每一個主流操作系統的伺服器端上。所以呢,要想成為一名優秀的全棧工程師,必須懂得JavaScript語言。這是我整理的JS的部分函數問題,供大家參考借閱,有不妥的地方也請多多指教。 1、函數的三要素 1.1 函數的功能 1.2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...