<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        ES6 更易于繼承的類語法的使用

        來源:懂視網 責編:小采 時間:2020-11-27 22:01:12
        文檔

        ES6 更易于繼承的類語法的使用

        ES6 更易于繼承的類語法的使用:和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍生出很多有趣的用法。 一、類的基本定義 基本所有面向對象的語言都支持類的封裝與繼承,那什么是類? 類是
        推薦度:
        導讀ES6 更易于繼承的類語法的使用:和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍生出很多有趣的用法。 一、類的基本定義 基本所有面向對象的語言都支持類的封裝與繼承,那什么是類? 類是

        和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍生出很多有趣的用法。

        一、類的基本定義

        基本所有面向對象的語言都支持類的封裝與繼承,那什么是類?

        類是面向對象程序設計的基礎,包含數據封裝、數據操作以及傳遞消息的函數。類的實例稱為對象。

        ES5 之前通過函數來模擬類的實現如下:

        // 構造函數
        function Person(name) {
         this.name = name;
        }
        // 原型上的方法
        Person.prototype.sayName = function(){
         console.log(this.name);
        };
        // new 一個實例
        var friend = new Person("Jenny");
        
        friend.sayName(); // Jenny
        console.log(friend instanceof Person); // true
        console.log(friend instanceof Object); // true
        
        

        總結來說,定義一個類的思路如下:

        1.需要構造函數封裝數據
        2.在原型上添加方法操作數據,
        3.通過New創建實例

        ES6 使用class關鍵字定義一個類,這個類有特殊的方法名[[Construct]]定義構造函數,在 new 創建實例時調用的就是[[Construct]],示例如下:

        /*ES6*/
        // 等價于 let Person = class {
        class Person {
         // 構造函數
         constructor(name) {
         this.name = name;
         }
         // 等價于Person.prototype.sayName
         sayName() {
         console.log(this.name);
         }
        }
        
        console.log(typeof Person); // function
        console.log(typeof Person.prototype.sayName); // function
        
        let friend = new Person("Jenny");
        
        friend.sayName(); // Jenny
        console.log(friend instanceof Person); // true
        console.log(friend instanceof Object); // true
        
        

        上面的例子中class定義的類與自定義的函數模擬類功能上貌似沒什么不同,但本質上還有很大差異的:

      1. 函數聲明可以被提升,但是class類聲明與let類似,不能被提升;
      2. 類聲明自動運行在嚴格模式下,“use strict”;
      3. 類中所有方法都是不可枚舉的,enumerable 為 false。
      4. 二、更靈活的類

        類和函數一樣,是JavaScript的一等公民(可以傳入函數、從函數返回、賦值),并且注意到類與對象字面量還有更多相似之處,這些特點可以擴展出類更靈活的定義與使用。

        2.1 擁有訪問器屬性

        對象的屬性有數據屬性和訪問屬性,類中也可以通過get、set關鍵字定義訪問器屬性:

        class Person {
         constructor(name) {
         this.name = name;
         }
        
         get value () {
         return this.name + this.age
         }
         set value (num) {
         this.age = num
         }
        }
        
        let friend = new Person("Jenny");
        // 調用的是 setter
        friend.value = 18
        // 調用的是 getter
        console.log(friend.value) // Jenny18
        
        

        2.2 可計算的成員名稱

        類似 ES6 對象字面量擴展的可計算屬性名稱,類也可以用[表達式]定義可計算成員名稱,包括類中的方法和訪問器屬性:

        let methodName = 'sayName'
        
        class Person {
         constructor(name) {
         this.name = name;
         }
        
         [methodName + 'Default']() {
         console.log(this.name);
         }
        
         get [methodName]() {
         return this.name
         }
        
         set [methodName](str) {
         this.name = str
         }
        }
        
        let friend = new Person("Jenny");
        
        // 方法
        friend.sayNameDefault(); // Jenny
        // 訪問器屬性
        friend.sayName = 'lee'
        console.log(friend.sayName) // lee

        想進一步熟悉對象新特性可參考: 【ES6】對象的新功能與解構賦值

        2.3 定義默認迭代器

        ES6 中常用的集合對象(數組、Set/Map集合)和字符串都是可迭代對象,如果類是用來表示值這些可迭代對象的,那么定義一個默認迭代器會更有用。

        ES6 通過給Symbol.iterator屬性添加生成器的方式,定義默認迭代器:

        class Person {
         constructor(name) {
         this.name = name;
         }
        
         *[Symbol.iterator]() {
         for (let item of this.name){
         yield item
         }
         }
        }
        
        var abbrName = new Person(new Set(['j', 'j', 'e', 'e', 'n', 'y', 'y', 'y',]))
        for (let x of abbrName) {
         console.log(x); // j e n y
        }
        console.log(...abbrName) // j e n y
        
        

        定義默認迭代器后類的實例就可以使用for-of循環和展開運算符(...)等迭代功能。

        對以上迭代器內容感到困惑的可參考:【ES6】迭代器與可迭代對象

        2.4 作為參數的類

        類作為"一等公民”可以當參數使用傳入函數中,當然也可以從函數中返回:

        function createClass(className, val) {
         return new className(val)
        }
        
        let person = createClass(Person,'Jenny')
        console.log(person) // Person { name: 'Jenny' }
        console.log(typeof person) // object
        
        

        2.5 創建單例

        使用類語法創建單例的方式通過new立即調用類表達式:

        let singleton = new class {
         constructor(name) {
         this.name = name;
         }
        }('Jenny')
         
        console.log(singleton.name) // Jenny
        

        這里先創建匿名類表達式,然后 new 調用這個類表達式,并通過小括號立即執行,這種類語法創建的單例不會在作用域中暴露類的引用。

        三、類的繼承

        回顧 ES6 之前如何實現繼承?常用方式是通過原型鏈、構造函數以及組合繼承等方式。

        ES6 的類使用熟悉的extends關鍵字指定類繼承的函數,并且可以通過surpe()方法訪問父類的構造函數。

        例如繼承一個 Person 的類:

        class Friend extends Person {
         constructor(name, phone){
         super(name)
         this.phone = phone
         }
        }
        
        let myfriend = new Friend('lee',2233)
        console.log(myfriend) // Friend { name: 'lee', phone: 2233 }
        
        

        Friend 繼承了 Person,術語上稱 Person 為基類,Friend 為派生類。

        需要注意的是,surpe()只能在派生類中使用,它負責初始化 this,所以派生類使用 this 之前一定要用surpe()。

        3.1 繼承內建對象

        ES6 的類繼承可以繼承內建對象(Array、Set、Map 等),繼承后可以擁有基類的所有內建功能。例如:

        class MyArray extends Array {
        }
        
        let arr = new MyArray(1, 2, 3, 4),
         subarr = arr.slice(1, 3)
        
        console.log(arr.length) // 4
        console.log(arr instanceof MyArray) // true
        console.log(arr instanceof Array) // true
        console.log(subarr instanceof MyArray) // true
        
        

        注意到上例中,不僅 arr 是派生類 MyArray 的實例,subarr 也是派生類 MyArray 的實例,內建對象繼承的實用之處是改變返回對象的類型。

        瀏覽器引擎背后是通過[Symbol.species]屬性實現這一行為,它被用于返回函數的靜態訪問器屬性,內建對象定義了[Symbol.species]屬性的有 Array、ArrayBuffer、Set、Map、Promise、RegExp、Typed arrays。

        3.2 繼承表達式的類

        目前extends可以繼承類和內建對象,但更強大的功能從表達式導出類!

        這個表達式要求可以被解析為函數并具有[[Construct]]屬性和原型,示例如下:

        function Sup(val) {
         this.value = val
        }
        
        Sup.prototype.getVal = function () {
         return 'hello' + this.value
        }
        
        class Derived extends Sup {
         constructor(val) {
         super(val)
         }
        }
        
        let der = new Derived('world')
        console.log(der) // Derived { value: 'world' }
        console.log(der.getVal()) // helloworld
        
        

        3.3 只能繼承的抽象類

        ES6 引入new.target元屬性判斷函數是否通過new關鍵字調用。類的構造函數也可以通過new.target確定類是如何被調用的。

        可以通過new.target創建抽象類(不能實例化的類),例如:

        class Abstract {
         constructor(){
         if(new.target === Abstract) {
         throw new Error('抽象類(不能直接實例化)')
         }
         }
        }
        
        class Instantiable extends Abstract {
         constructor() {
         super()
         }
        }
        
        // let abs = new Abstract() // Error: 抽象類(不能直接實例化)
         let abs = new Instantiable()
        console.log(abs instanceof Abstract) // true

        雖然不能直接使用 Abstract 抽象類創建實例,但是可以作為基類派生其它類。

        四、類的靜態成員

        ES6 使用static關鍵字聲明靜態成員或方法。在類的方法或訪問器屬性前都可以使用static,唯一的限制是不能用于構造函數。

        靜態成員的作用是某些類成員的私有化,及不可在實例中訪問,必須要直接在類上訪問。

        class Person {
         constructor(name) {
         this.name = name;
         }
        
         static create(name) {
         return new Person(name);
         }
        }
        
        let beauty = Person.create("Jenny");
        // beauty.create('lee') // TypeError
        
        

        如果基類有靜態成員,那這些靜態成員在派生類也可以使用。

        例如將上例的 Person 作為基類,派生出 Friend 類并使用基類的靜態方法create( ):

        class Friend extends Person {
         constructor(name){
         super(name)
         }
        }
        
        var friend = Friend.create('lee')
        console.log(friend instanceof Person) // true
        console.log(friend instanceof Friend) // false
        
        

        可以看出派生類依然可以使用基類的靜態方法。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ES6 更易于繼承的類語法的使用

        ES6 更易于繼承的類語法的使用:和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍生出很多有趣的用法。 一、類的基本定義 基本所有面向對象的語言都支持類的封裝與繼承,那什么是類? 類是
        推薦度:
        標簽: 容易 es 繼承
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲人成激情在线播放| 亚洲午夜久久久影院| 成av免费大片黄在线观看| 亚洲免费二区三区| 亚洲毛片不卡av在线播放一区| 久久er国产精品免费观看8| 一本色道久久综合亚洲精品| 69成人免费视频| 免费高清国产视频| 特级毛片全部免费播放a一级| 亚洲国产高清在线| 中文亚洲AV片不卡在线观看| 好吊妞788免费视频播放| 亚洲免费精彩视频在线观看| 国产高潮流白浆喷水免费A片 | 国产亚洲美女精品久久| 亚洲欧美国产欧美色欲| 亚洲av无码潮喷在线观看| 国产一区二区三区无码免费| 国产精品无码素人福利免费 | 在线观看免费污视频| 日韩中文无码有码免费视频| 国产伦精品一区二区三区免费下载| 看全色黄大色大片免费久久| 日韩亚洲精品福利| 久久综合九九亚洲一区| 亚洲欧美日韩一区二区三区在线| 猫咪免费人成网站在线观看入口| 免费成人在线电影| 免费鲁丝片一级观看| 亚洲人成网站观看在线播放| 亚洲精品97久久中文字幕无码| 亚洲s色大片在线观看| 77777亚洲午夜久久多喷| 五月天婷婷精品免费视频| 99免费观看视频| 亚洲国产精品尤物YW在线观看| 亚洲视频网站在线观看| 一区二区在线视频免费观看| 国产一卡2卡3卡4卡2021免费观看| 国产精品国产自线拍免费软件|