ES6--class基本使用

来源:http://www.cnblogs.com/shinhwazt/archive/2016/12/07/6035533.html
-Advertisement-
Play Games

類定義 ES6完整學習阮老師的ECMAScript6入門。 技術一般水平有限,有什麼錯的地方,望大家指正。 以前我們使用ES5標准定義一個構造函數的過程如下: 通常首字母大寫的函數我們稱為構造函數(並不是一種語法約束,只是一種約定俗成的規律),屬性寫在方法裡面,函數寫在原型上面,這樣實例化(new操 ...


類定義

  ES6完整學習阮老師的ECMAScript6入門

  技術一般水平有限,有什麼錯的地方,望大家指正。

  以前我們使用ES5標准定義一個構造函數的過程如下:

  function Person(name,age){
      this.name = name;
      this.age = age;
  }
  Person.prototype.say = function(){
      console.log("你好,我是"+this.name)
  }
  Person.prototype.show = function(){
      console.log("年齡"+this.age+"一名小學生!");
  }

  通常首字母大寫的函數我們稱為構造函數(並不是一種語法約束,只是一種約定俗成的規律),屬性寫在方法裡面,函數寫在原型上面,這樣實例化(new操作)出來的對象既有屬性也有方法。

  ES6為了更明朗構造函數這個概念了多了一個class語法,它會幫我們完成上面的一系列操作,我們可以把它看做是構造函數的變身,通常我們稱為類。JS中的類同函數一樣也有兩種聲明方式:

  類聲明:

  class Person{
  }

  類表達式:

var Person = class {
}

  現在我們利用類來對開始的構造函數進行變形:

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      say(){
          console.log("你好,我是"+this.name);
      }
      show(){
          console.log("年齡"+this.age+"一名小學生!");
      }
  }

  我們實例化一個Person的對象,是可以正常使用的:

  var me = new Person("zt",23);
  me.say();
  me.show();

  原來的構造函數現在變成了一個類,constructor就是構造函數對參數進行初始化的變形,say和show就是構造函數原型上面的函數。

  類就是對有同樣特征的事物的一個統稱,在JS的類裡面只能包括函數,不能包含別的,如果我們需要給類添加一個屬性只能通過get/set存取器方法來實現:

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      get message()
      {
          return "name:"+this.name+",age:"+this.age
      }
  }
  var me = new Person("zt",23);
  console.log(me.message);

  constructor函數在類裡面最多只能有一個,它的主要職能就是初始化屬性,在執行new操作時先經由constructor函數將參數設置為對象的屬性,如果不需要存在初始化屬性那麼constructor可以省略。

函數修飾

  類裡面定義的函數可以被修飾符修飾最常見的就是static。

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      static say(){
          console.log("由類調用");
      }
  }
  Person.say();

  一旦一個函數被static修飾,那麼這個函數就屬於類了,可以直接由類名來調用Person.say()。而普通函數是不能直接由類進行調用的,普通函數只能由實例化的對象來調用,被static修飾的函數是不能被實例化的對象調用的只能通過類直接來進行調用,這種函數等價於我們以前直接利用Person.fn = function(){}定義工具函數一樣。

類繼承

  一個類可以繼承一個類,被繼承的類我們一般稱為父類,另一個稱為子類,通過extends來實現:

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      static say(){
          console.log("我是"+this.name);
      }
  }
  class Student extends Person{
  }

  新創建的Student類是子類,Person類是父類,子類會擁有父類裡面的所有函數(constructor和其他函數),子類繼承來的函數都是可以直接使用的:

  var stu = new Student("zt",23)
  stu.say();

  子類裡面沒有聲明任何函數,仍然可以調用say,say就是通過繼承得來的。

  子類可以定義自己的特有的函數,如果和父類函數同名那麼就父類的函數就不會生效而是使用子類自身的函數(就是ES5原型鏈查找的套路):

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      say(){
          console.log("我是"+this.name);
      }
  }
  class Student extends Person{
      say(){
          console.log("我是子類的say函數!")
      }
      fn(){
          console.log("我是子類函數fn")
      }
  }
  var stu = new Student("asaszt",23)
  stu.say();//我是子類的say函數!
  stu.fn();//我是子類函數fn

在子類中使用super

  子類會繼承父類的constructor函數來初始化自身的屬性,同樣也可以添加自身特有的屬性,但是必須使用super來完成這個操作:

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
  }
  class Student extends Person{
      constructor(name,age,sex){
          super(name,age);
          this.sex = sex;
      }
  }
  var stu = new Student("zt",23,"男")
  console.log(stu.sex);//

  在子類中使用constructor來初始化屬性,首先使用super來對可繼承的屬性進行初始化,然後在通過this添加自身特有的屬性,this只有在調用super()之後才會存在。

  super同樣可以調用父類的非靜態函數(此時我們可以把super看做是一個父類實例化出來的一個對象):

  class Person{
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      say(){
          console.log("我是父類的say函數");
      }
  }
  class Student extends Person{
      constructor(name,age,sex){
          super(name,age);
          this.sex = sex;
      }
      say(){
          super.say();
          console.log("我是子類的say函數");
      }

  }
  var stu = new Student("zt",23)
  stu.say();//我是父類的say函數 我是子類的say函數

 


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

-Advertisement-
Play Games
更多相關文章
  • 隨著**CPU速度**的不斷提高和**軟體規模**的不斷擴大,人們當然希望存儲器能同時滿足**速度快、容量大、價格低**的要求。但實際上這一點很難辦到,解決這一問題的較好方法是設計一個**快慢搭配**、具有層次結構的存儲系統。 ...
  • 摘要: 介紹各平臺下的圖形化界面git客戶端(本人並沒有全部使用過),歡迎大家補充新的軟體或者使用感受~ 一、TortoiseGit - The coolest Interface to Git Version Control TortoiseGit 是 TortoiseSVN 的 Git 版本,T ...
  • 1、nginx相對於apache的優點: 輕量級,同樣起web 服務,比apache 占用更少的記憶體及資源 抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能 高度模塊化的設計,編寫模塊相對簡單 社區活躍,各種高性能模塊出品迅速啊 ...
  • 最近因公司項目原因,去了趟昆明出差,其中第一次接觸安裝redis,配置sentinel,學習到不少,但也都是皮毛而已,本隨筆記下所學知識。 1、首先介紹下redis,來源自百度百科 redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括stri ...
  • 剛學了js的一些函數,所以做了一個太極的旋轉。做完之後是上面這個樣子的,是可以旋轉的。 思路: 1.先做一個基準轉盤,之後將元素都放在轉盤上,跟隨轉盤動。 2.畫兩個半圓,主要屬性是border-top-right-radius: 250px; 像素值為長邊的一半。 3.然後畫4個圓,以基準轉盤為父 ...
  • JavaScript組成: ECMAscript 瀏覽器對象模型 BOM 文檔對象模型 DOM // ecmascript bom dom dom (文檔對象模型) 用來訪問和操縱html文檔 bom (瀏覽器對象模型) js 是瀏覽器語言 JavaScript引入: 1 <script src=“ ...
  • 背景(background)是css中很重要的一部分,也是css的基礎知道之一,現在來回顧css2中5個屬性與css3中新增的3個屬性和2個功能。 CSS2_背景(background)前傳 家族成員 背景(background)家族在css2中由5個主要的背景屬性組成,分別是: 想知道家族五大成員 ...
  • 背景: 自從今年下半年接觸一個基於ReactJS 的手機APP項目。開始瞭解到了Corodva這個神奇的東西。後續自己也自作了一些小的APP放到了應用寶上。8月份開始想做一個博客園APP。於是就私聊博客園團隊申請了博客園API訪問許可權(當然其實應用寶裡面也有博客園APP了。而且用fiddler抓取了 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...