首頁 web前端 js教程 淺談使用MVC模式進行JavaScript程式開發_javascript技巧

淺談使用MVC模式進行JavaScript程式開發_javascript技巧

May 16, 2016 pm 03:32 PM
javascript mvc

隨著前台開發日益受到重視,客戶端程式碼比重日益增加的今天,如何在javascript開發裡應用MVC模式,這個問題似乎會一直被提到,所以偶在這裡粗略的談一下自己的看法吧。

MVC模式的基本概念,是透過把一個application封裝成model, view和controller三個部分達到降低耦合,簡化開發的目的。這麼說很空洞,大家可以實際看個例子:

<select id="selAnimal">
  <option value="cat">cat</option>
  <option value="fish">fish</option>
  <option value="bird">bird</option>
</select>
<p id="whatDoesThisAnimalDo"></p>

<script type="text/javascript">
document.getElementById('selAnimal').onchange = function() {
  var thisAnimalDoes;
  switch ( this.value ) {
    case 'cat':
      thisAnimalDoes = "cat meows";
      break;
    case 'fish':
      thisAnimalDoes = "fish swims";
      break;
    case 'bird':
      thisAnimalDoes = "bird flies";
      break;
    default:
      thisAnimalDoes = "wuff&#63;";
  }
  document.getElementById('whatDoesThisAnimalDo').innerHTML = thisAnimalDoes;
}
</script>

登入後複製

這個小程式會把你從下拉式選單"selAnimal"中所選的動物能做什麼事回顯到網頁上。以上是沒有應用任何設計模式和編成思想寫出的程式碼。如果要在這裡應用MVC模式,程式碼又會變成怎樣的呢?

<select id="selAnimal">
  <option value="cat">cat</option>
  <option value="fish">fish</option>
  <option value="bird">bird</option>
</select>
<p id="whatDoesThisAnimalDo"></p>

<script type="text/javascript">
// whatDoesAnimalDo 就是一个controller
var whatDoesAnimalDo = {
  // 选择视图
  start: function() {
    this.view.start();
  },
  // 将用户的操作映射到模型的更新上
  set: function(animalName) {
    this.model.setAnimal(animalName);
  },
};
// whatDoesAnimalDo的数据model
whatDoesAnimalDo.model = {
  // animal的数据
  animalDictionary: {
    cat: "meows",
    fish: "swims",
    bird: "flies"
  },
  // 当前的animal,也就是这个application的状态
  currentAnimal: null,
  // 数据模型负责业务逻辑和数据存储
  setAnimal: function(animalName) {
    this.currentAnimal = this.animalDictionary[animalName] &#63; animalName : null;
    this.onchange();
  },
  // 并且通知视图更新显示
  onchange: function() {
    whatDoesAnimalDo.view.update();
  },
  // 还需要响应视图对当前状态的查询
  getAnimalAction: function() {
    return this.currentAnimal &#63; this.currentAnimal + " " + this.animalDictionary[this.currentAnimal] : "wuff&#63;";
  }
};
// whatDoesAnimalDo的视图
whatDoesAnimalDo.view = {
  // 用户输入触发onchange事件
  start: function() {
    document.getElementById('selAnimal').onchange = this.onchange;
  },
  // 该事件将用户请求发送给控制器
  onchange: function() {
    whatDoesAnimalDo.set(document.getElementById('selAnimal').value);
  },
  // 视图更新显示的方法,其中视图会向model查询当前的状态,并将其显示给用户
  update: function() {
    document.getElementById('whatDoesThisAnimalDo').innerHTML = whatDoesAnimalDo.model.getAnimalAction();
  }
};
whatDoesAnimalDo.start();
</script>

登入後複製

……突然一下程式碼變得好誇張e....
——偶都還沒有在裡面實現觀察者模式呢...
實在太不良好了。

 

這樣就帶出了MVC模式最大的詬病:在簡單的系統中應用MVC模式,會增加結構的複雜性,並且降低效率。

所以偶覺得除了少數javascript控件,例如click-anywhere-to-edit datagrid/tree control, 或者FckEditor/tinyMCE這樣的支援自訂plugin的富文本編輯器非常適合應用MVC之外,在大多數的實用B/S系統中,javascript開發只要遵循工廠模式就夠讓你受益匪淺了。這是由於前端開發和後段開發的性質不同所引起的。如果在ASP.net或JSP專案中應用MVC模式,SDK或多或少會自動產生一些view和controller的程式碼。但javascript呢——javascript甚至連個好用的SDK都沒有,雖然有不少成熟的framework,但最終還是會大大增加開發量。

與開發量相比,更令人頭痛的是效率的問題。三層之間的相互通訊都是額外的開銷。對於伺服器端,這些通訊造成的開銷幾乎可以忽略不計。但對於javascript這樣相對低效率的語言,多幾重呼叫和事件偵聽就能明顯感覺到效能的下降了。而且,因為javascrip的閉包特性,一不小心就搞出內存洩漏,這可是正宗的偷雞不成蝕把米了...
所以,對於javascript開發,適度開發可能比應用你所學到的學術知識更重要,畢竟前端開發是以解決實際問題為基礎,而不是為了炫技。當然,Dflying gg有句話叫做「重構無所不在」──如果你覺得你自己的程式碼越來越亂,維護起來越來越困難,那麼,你就該考慮是不是該用MVC重構一下了~

 

再額外的說一句:是不是整個前端開發就不必使用MVC了呢? no no~ 其實整個前端開發就是一個大大的MVC架構啊-

Model: HTML/XHTML中的資訊
View: Style sheet
Controller: EMAScripts等等腳本
這不正是web標準的最終目的麼....

所以,把握整個前端程式碼的結構,永遠比在javascript開發中過量應用設計模重要的多!

不過,也有一些優秀的MVC框架,對此西雅圖的一位黑客和設計師Gordon L. Hempton做了一下對比,這裡我們拉過來看一下:

1. Backbone.js-優點:強大的社區,強勁的勢頭;缺點:抽象較弱,很多功能亟待增加。
2. SproutCore-優點:對綁定的支持,可靠的社區,大量特性;缺點:過度規範,難以和不需要的特性解耦。
3. Sammy.js-優點:易於學習,更容易且現存的服務端應用程式整合;缺點:過於簡單,無法應用於大型應用程式。
4. Spine.js——優點:輕量級,文件很完備;缺點:它的核心概念「spine」是異步的使用者介面,這意味著理想狀況使用者介面永遠不會發生堵塞,而這個基礎有缺陷。
5. Cappuccino——優點:大型深思熟慮後的框架,良好的社區,很棒的繼承模型;缺點:由iOS開發者創建,使用JavaScript模擬Objective-C。
6. Knockout.js——優點:對綁定的支持,完備的文檔和教程;缺點:綁定語法拙劣,缺少統一的視圖組件層級關係。
7. Javascript MVC-優點:可靠的社群;缺點:基於字串的繼承模型很差,控制器與視圖關係過密而缺少綁定。
8. GWT(Google Web Toolkit)-優點:全面的框架,良好的社區,可靠的基於Java的組件繼承模型;缺點:可能無法經受時間的考驗,另外,Java在客戶端上的抽像有些笨拙。
9. Google Closure——優點:很好的基於組件的UI組合系統。缺點:缺少UI綁定支援。
10. Ember.js-優點:很豐富的範本系統,擁有複合視圖和UI綁定;缺點:相對較新,文件不夠完備。
11. Angular.js——優點:對模板範圍和控制器設計有很好的考慮,擁有依賴注入系統,支援豐富的UI綁定語法。缺點:程式碼的模組性不強,視圖的模組化也不夠。
12. Batman.js——優點:程式碼清晰,綁定、持久化的方法簡單;缺點:使用了單例控制器。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

PHP MVC 架構:建立面向未來的 Web 應用程式 PHP MVC 架構:建立面向未來的 Web 應用程式 Mar 03, 2024 am 09:01 AM

引言在當今快速發展的數位世界中,建立健壯、靈活且可維護的WEB應用程式至關重要。 PHPmvc架構提供了實現這一目標的理想解決方案。 MVC(模型-視圖-控制器)是一種廣泛使用的設計模式,可將應用程式的各個方面分離為獨立的元件。 MVC架構的基礎MVC架構的核心原理是分離關注點:模型:封裝應用程式的資料和業務邏輯。視圖:負責呈現資料並處理使用者互動。控制器:協調模型和視圖之間的交互,管理使用者請求和業務邏輯。 PHPMVC架構phpMVC架構遵循傳統MVC模式,但也引進了語言特定的功能。以下是PHPMVC

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

See all articles