Es6 類的關鍵 super、static、constructor、new.target

来源:http://www.cnblogs.com/lmyt/archive/2017/08/29/7446800.html
-Advertisement-
Play Games

ES6引入了Class(類)這個概念,作為對象的模板,通過class關鍵字,可以定義類。基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。 那麼如何掌握類這項技能,讓我來陪大家一起學習: ...


ES6引入了Class(類)這個概念,作為對象的模板,通過class關鍵字,可以定義類。基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。

那麼如何掌握類這項技能,讓我來陪大家一起學習:

 1.super關鍵字

 super用在調用的時候有兩種情況:

第一種情況,super作為函數調用時,代表父類的構造函數。
第二種情況,super作為對象時,在普通方法中,指向父類的原型對象;在靜態方法中,指向父類。

 

class Person {
  constructor (name) {
    this.name = name;
  }
  height(){
      console.log(1);
  }
  static weight(){
      console.log(2);
  }
}
class Student extends Person {
  constructor (name, age) {
    super();  //代表父類的構造函數
    this.age = age;
  }
  height(){
      super.height(); //指向父類的原型對象
  }
  static weight(){
      super.weight(); //指向父類
  }
}

如果子類調用constructor,那麼子類必須在constructor方法中調用super方法,否則新建實例時會報錯。這是因為子類沒有自己的this對象,而是繼承父類的this對象,然後對其進行加工。如果不調用super方法,子類就得不到this對象。

總結下:

super 關鍵字用於調用一個對象的父對象上的函數。
super.prop 和 super[expr] 表達式在類 和 對象字面量 任何 方法定義 中都是有效的。
在構造函數中使用時,super關鍵字單獨出現,必須在可以使用this關鍵字之前使用。此關鍵字也可用於調用父對象上的函數。

 

2.static關鍵字

類相當於實例的原型, 所有在類中定義的方法, 都會被實例繼承。 如果在一個方法前, 加上static關鍵字, 就表示該方法不會被實例繼承, 而是直接通過類來調用, 這就稱為“ 靜態方法”。

靜態方法調用直接在類上進行,而在類的實例上不可被調用。

靜態方法通常用於創建 實用/工具 函數。

通過例子我們可以發現,靜態方法是通過類名直接調用的

從另一個靜態方法為了在同一個類的另一個靜態方法中調用一個靜態方法,你可以使用 this 關鍵字。

class StaticMethodCall {
    static staticMethod() {
        return 'Static method has been called';
    }
    static anotherStaticMethod() {
        return this.staticMethod() + ' from another static method';
    }
}
StaticMethodCall.staticMethod();
// 'Static method has been called'

StaticMethodCall.anotherStaticMethod();
// 'Static method has been called from another static method'

從類的構造函數和其他方法靜態方法不能直接在非靜態方法中使用 this 關鍵字來訪問。你需要使用類名來調用它們:CLASSNAME.STATIC_METHOD_NAME() 或者將其作為構造函數的屬性來調用該方法: this.constructor.STATIC_METHOD_NAME().

class StaticMethodCall {
    constructor() {
        console.log(StaticMethodCall.staticMethod());
        // 'static method has been called.'
        console.log(this.constructor.staticMethod());
        // 'static method has been called.'
    }
    static staticMethod() {
        return 'static method has been called.';
    }
}

 

3.new.target 關鍵字

    new.target屬性允許你檢測函數或構造方法是否通過是通過new運算符被調用的。在通過new運算符被初始化的函數或構造方法中,new.target返回一個指向構造方法或函數的引用。在普通的函數調用中,new.target 的值是undefined。

  怎麼理解這段話,也就是說new.target的功能就是用來檢測函數的調用是不是通過 new 去創建一個新對象的,而且new.target返回的是一個指向函數的引用,也就是說我們能夠確定是哪個函數進行了new操作

class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A { constructor() { super(); } }

var a = new A(); // logs "A"
var b = new B(); // logs "B"

new.target 最大的作用就是讓構造器知道當前到底 new 的是哪個類。

 

延伸下。ES6之前怎麼實現這個功能?

var A = function A() {
  if(!(this instanceof A)) throw 'Constructor A requires "new"';
  // ···
};

然而這依然可以通過 call 或 apply 來調用。比如:

var a = A.call(Object.create(A.prototype));

那麼用ES6就是下麵這樣操作了

var A = function A() {
  if(!new.target) throw 'Constructor A requires "new"';
  // ···
};

 4.constructor關鍵字

構造方法是創建和初始化使用類創建的一個對象的一種特殊方法。

class Square extends Polygon {
  constructor(length) {
    // 在這裡調用父類的"length",賦值給矩形的"width"和"height"。
    super(length, length);
    // 註意:子類必須在constructor方法中調用super方法,否則新建實例時會報錯。
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  } 
}

如果沒有顯式定義,會預設添加一個空的constructor方法。對於基類"Base classes",預設構造方法如下:

constructor() {}

對於派生類"Derived classes" ,預設構造方法如下:

constructor(...args) {
  super(...args);
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 針對功能需求 是否詳細定義了系統的全部輸入,包括其他源、精度、取值範圍、出現頻率等 是否定義了系統的全部輸出,包括目的地、精度、取值範圍、出現頻率、格式等 是否詳細定義了所有輸出格式,web頁面、報表等 是否詳細定義了所有硬體和軟體的外部介面,是否詳細定義了全部外部通信介面,包括握手協議,糾錯協議、 ...
  • 兩個介面,一個主題介面(一般包含了註冊觀察者,刪除觀察者,發佈三個方法),一個觀察者介面(一般只要有一個update,但發佈消息時給主題調用). 1.觀察者介面 2.主題發佈者介面 3.觀察者實現 4.主題發佈者實現 5.整合測試,兄弟 結果應該是這樣的,他們都收到了消息. ...
  • 接收請求參數 一、使用HttpServletRequest 二、參數自動匹配 SpringMVC會自動將表單參數註入到方法參數,只要和表單的name屬性保持一致 前端請求的表單 Controller代碼 三、bean對象的自動裝箱 Controller代碼段 四、 @RequestParam獲取參數 ...
  • 顧名思義,是出現在系統邊界上的一個面向API的、串列集中式的強管控服務,這裡的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯 ...
  • 生產者與消費者模式是《設計模式》的書籍中推薦的23種模式之一,下麵我們根據示例實現此模式的代碼例子: 生產者A: //生產者A public class ProducerA extends Thread{ // 生產一個商品 private void produceGoods() { String ...
  • 目前,不管是前端開發人員還是個人站長,經常需要一些代碼處理類的工具,比如:代碼對比、代碼格式化、圖標製作等。有時就是一時急用可電腦上又沒有安裝相關的軟體,這裡為大家收集了一些我們經常會用到的線上工具。 代碼對比/歸併: http://www.matools.com/compare 正則表達式: ht ...
  • location對象其實就是window.location,其中頂級對象window可以省略 主要的屬性 location.host 主機 location.hostname 主機名 location.port 埠 location.protocol 協議 location.pathname 路徑 ...
  • 在jquery中,插件開發常見的有: 一種是為$函數本身擴展一個方法,這種是靜態擴展(也叫類擴展),這種插件一般是工具方法, 還有一種是擴展在原型對象$.fn上面的,開發出來的插件是用在dom元素上面的 一、類級別的擴展 註意要提前引入jquery庫, 上例在$函數上面添加了一個方法showMsg, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...