【譯】3 ways to define a JavaScript class

来源:http://www.cnblogs.com/venoral/archive/2016/07/02/5635130.html
-Advertisement-
Play Games

本文真沒啥難點,我就是為了檢驗我英語水平退化了沒哈哈雖然我英語本來就渣翻譯起來也像大白話。將原文看了一遍也碼完翻譯了一遍差不多一個小時,其中批註部分是自己的理解如有疏漏或誤解還請之處感激不盡吶,比如JavaScript中對於單例的理解感覺定義有些模糊啊。 翻譯自斯托揚·斯蒂凡諾夫的原文鏈接:http ...


本文真沒啥難點,我就是為了檢驗我英語水平退化了沒哈哈雖然我英語本來就渣翻譯起來也像大白話。將原文看了一遍也碼完翻譯了一遍差不多一個小時,其中批註部分是自己的理解如有疏漏或誤解還請指出感激不盡吶,比如JavaScript中對於單例的理解感覺定義有些模糊啊。

翻譯自斯托揚·斯蒂凡諾夫的原文鏈接:http://www.phpied.com/3-ways-to-define-a-javascript-class/

引言

當涉及到語法時JavaScript是一個非常靈活的面向對象語言。這篇文章你可以找到三種方式定義和實例化一個對象。即使你已經用了某個你喜歡的方式,下麵的介紹幫助你去瞭解一些別的方式有助於你閱讀別人的代碼。

需要註意的是在JavaScript中沒有類的概念,但是通過 Function 可以模擬類,JavaScript中基本一切事物皆對象,在繼承方面,對象繼承對象而不是類繼承類。

 

1.使用 function 

這可能是最通用的一種方法了,定義一個JavaScript function然後通過 new 關鍵字創建一個實例對象,通過這個function, this 關鍵字來給這個實例對象添加屬性和方法。下麵是一個例子。

function Apple (type) {
   this.type = type;
   this.color = "red";
   this.getInfo = getAppleInfo;
}

// anti-pattern!(反模式) keep reading...
function getAppleInfo() {
   return this.color + ' ' + this.type + ' apple';
}

這個對象實例的創建需要用Apple構造器函數,添加一些屬性然後調用一些方法,請繼續看:

var apple = new Apple('macintosh');
apple.color = "reddish";
alert(apple.getInfo());

  1.1.方法定義在內部

在上面例子中我們看到Apple"類"的getInfo方法分隔出來被定義為 function getAppleInfo() 。這樣看起來工作的很好,但有一個弊端——你可能會在最後定義許多類型這樣的functions,它們都在"全局命名空間"。這意味著當你用相同的名字創建另一個function(或者使用了其他的庫)會產生命名衝突。為了防止這種現象,你可以將方法定義在構造器函數內部,就像這樣:

function Apple (type){
   this.type = type;
   this.color = "red";
   this.getInfo = function() {
      return this.color + ' ' + this.type + ' apple';
   }
}

這種語法創建實例和之前的並沒什麼區別。

  1.2.方法被添加在原型屬性上

1.1的方式中仍然存在弊端,在每一次創建新實例的時候 getInfo() 方法會被每次都添加到實例對象上。有時這可能不是你想要的,一個有效的方法添加 getInfo() 就是將其定義在構造函數的原型屬性上。

function Apple (type) {
   this.type = type;
   this.color = "red";
}

Apple.prototype.getInfo = function() {
   return this.color + ' ' + this.type + ' apple';
};

可以與1.和1.1相同的方式使用。

 

2.使用對象自面量

在JavaScript中對象字面量是一個快速精簡的方式去定義一個對象實例或數組實例,為了創建一個空對象你可以:

var o = {};

來代替通用的方法:

var o = new Object();

創建數組實例你可以:

var a = [];

來代替:

var a = new Array();

這樣的方式你可以跳過類從而立即創建實例(object)。下麵仍用先前的例子描述,這次用對象字面量的語法:

var apple = {
   type: "macintosh",
   color: "red",
   getInfo: function () {
       return this.color + ' ' + this.type + ' apple';
   }
}

這種方式你不必通過類創建一個實例,因為這個實例對象已經存在了,你只需要使用它就好:

apple.color = "reddish";
alert(apple.getInfo());

這種實例有時被叫做單例,在一些典型的語言比如Java,單例意味著對於某個類任何時候你只能有一個單一的實例,你不能從相同的類中創建更多實例對象。但在JavaScript中這個概念是沒有意義的因為所有的對象都是從單例開始的(批註:JavaScript中最大的原生對象就是Object,它既是對象也是構造函數,它只有一個,其他原生對象Function,Array等也是,所以JavaScript實現的是單例繼承了單例?? :),任何時候都可以創建一個自面量對象)。

 

3.在函數中使用單例

第三種方式是前兩種方式的結合,你可以使用函數來定義一個單例對象,這是語法:

var apple = new function() {
    this.type = "macintosh";
    this.color = "red";
    this.getInfo = function () {
       return this.color + ' ' + this.type + ' apple';
    }
}

這定義和1.1非常相似,在使用實例對象上和2相似。

apple.color = "reddish";
alert(apple.getInfo());

 new function(){...} 做了兩件事:定義了一個函數(匿名構造器)並使用 new 調用它。這可能看起來有點迷惑如果你之前沒怎麼用過的話,但是這是一個很好的選擇,當你真的需要一個構造函數而又只使用一次並且又不用給它賦名時。(批註:這種方式好像看起來好簡潔,因為給單例指定了類型,記得《高程》里給單例指定類型叫“增強的模塊模式”,對於此例的話用法如下:

var apple = function (){
    var obj = new Apple();
    return obj; 
}();

 

總結

通過上面三種方式創建實例對象,JavaScript是沒有類的定義的,真是個神奇的語言...


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

-Advertisement-
Play Games
更多相關文章
  • 在 HttpRequest 對象中,屬性 GET 和 POST 得到的都是 django.http.QueryDict 所創建的實例。這是一個 django 自定義的類似字典的類,用來處理同一個鍵帶多個值的情況。 在 python 原始的字典中,當一個鍵出現多個值的時候會發生衝突,只保留最後一個值。 ...
  • 一、過濾器 過濾器就是向web應用程式的請求和和響應添加功能的組件。過濾器能夠實現客戶端和目標資源之間的交互信息進行篩選和過濾,最終保留有效的數據信息。 二、過濾器的生命周期 2.1 實例化。 web容器複製創建過濾器的實例來完成過濾器的實例化,只會實例化一次。 2.2 初始化。 在進行過濾工作前會 ...
  • 一、servlet的概念 Servlet是一種獨立與平臺和協議的伺服器端java應用程式,通過Servlet可以生成動態web頁面,同時使用Servlet還可以在伺服器端對客戶的請求進行處理,控製程序的執行。 Servlet的主要作用就是互動式的瀏覽和更新數據,並生成動態的頁面內容展示。 1. 服務 ...
  • 題目:輸入兩個鏈表,找出它們的第一個公共節點。鏈表的定義如下: 思路1:採用蠻力的方法:在第一個鏈表上順序遍歷每個節點,每遍歷到一個節點的時候,在第二個鏈表上順序遍歷每個節點。如果第二個鏈表上的節點和第一個鏈表上的節點一樣,就說明兩個鏈表在節點上重合,於是就找到了公共的節點。而通常蠻力並不是好的方法 ...
  • HTTP 應用的信息是通過 請求報文 和 響應報文 傳遞的,關於更多的相關知識,可以閱讀《HTTP權威指南》獲得。 其中 請求報文 由客戶端發送,其中包含和許多的信息,而 django 將這些信息封裝成了 HttpRequest 對象,該對象由 HttpRequest 類創建。每一個請求都會生成一個 ...
  • 這周還是在改自己的這個框架,被多線程折騰了兩天,最終無奈放棄在游戲啟動時調用引擎進行圖片相關資源的初始化,當然進展還是不錯的。 嗯,下麵還是以流水的方式繼續記錄一下本周完成的工作: 1、調通了客戶端與lua的相互調用,用的是verysimple這個第三方庫(跨平臺的庫)。這邊遇到一個坑,特此記錄。 ...
  • 1基礎理論部分 分頻,是的,這個概念也很重要。分頻是指將一單一頻率信號的頻率降低為原來的1/N,就叫N分頻。實現分頻的電路或裝置稱為“分頻器”,如把33MHZ的信號2分頻得到16.5MHZ的信號,3分頻得到11MHZ的信號,10分頻得到3.3MHZ的信號。 分頻主要是相對於主晶振來說,用不到那麼高的 ...
  • C++並不是一個純粹的面向對象的語言,而是一種基於過程和麵向對象的混合型的語言。 凡是以類對象為基本構成單位的程式稱為基於對象的程式,再加上抽象、封裝、繼承和多態就成為面向對象程式。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...