最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6 更易于繼承的類語(yǔ)法的使用

 更新時(shí)間:2019年02月11日 11:45:21   作者:JennyTong  
這篇文章主要介紹了ES6 更易于繼承的類語(yǔ)法的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

和其它面向?qū)ο缶幊陶Z(yǔ)言一樣,ES6 正式定義了 class 類以及 extend 繼承語(yǔ)法糖,并且支持靜態(tài)、派生、抽象、迭代、單例等,而且根據(jù) ES6 的新特性衍生出很多有趣的用法。

一、類的基本定義

基本所有面向?qū)ο蟮恼Z(yǔ)言都支持類的封裝與繼承,那什么是類?

類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),包含數(shù)據(jù)封裝、數(shù)據(jù)操作以及傳遞消息的函數(shù)。類的實(shí)例稱為對(duì)象。

ES5 之前通過(guò)函數(shù)來(lái)模擬類的實(shí)現(xiàn)如下:

// 構(gòu)造函數(shù)
function Person(name) {
 this.name = name;
}
// 原型上的方法
Person.prototype.sayName = function(){
 console.log(this.name);
};
// new 一個(gè)實(shí)例
var friend = new Person("Jenny");

friend.sayName(); // Jenny
console.log(friend instanceof Person);  // true
console.log(friend instanceof Object);  // true

總結(jié)來(lái)說(shuō),定義一個(gè)類的思路如下:

1.需要構(gòu)造函數(shù)封裝數(shù)據(jù)
2.在原型上添加方法操作數(shù)據(jù),
3.通過(guò)New創(chuàng)建實(shí)例

ES6 使用class關(guān)鍵字定義一個(gè)類,這個(gè)類有特殊的方法名[[Construct]]定義構(gòu)造函數(shù),在 new 創(chuàng)建實(shí)例時(shí)調(diào)用的就是[[Construct]],示例如下:

/*ES6*/
// 等價(jià)于 let Person = class {
class Person {
 // 構(gòu)造函數(shù)
 constructor(name) {
  this.name = name;
 }
 // 等價(jià)于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定義的類與自定義的函數(shù)模擬類功能上貌似沒(méi)什么不同,但本質(zhì)上還有很大差異的:

  • 函數(shù)聲明可以被提升,但是class類聲明與let類似,不能被提升;
  • 類聲明自動(dòng)運(yùn)行在嚴(yán)格模式下,“use strict”;
  • 類中所有方法都是不可枚舉的,enumerable 為 false。

二、更靈活的類

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

2.1 擁有訪問(wèn)器屬性

對(duì)象的屬性有數(shù)據(jù)屬性和訪問(wèn)屬性,類中也可以通過(guò)get、set關(guān)鍵字定義訪問(wèn)器屬性:

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");
// 調(diào)用的是 setter
friend.value = 18
// 調(diào)用的是 getter
console.log(friend.value) // Jenny18

2.2 可計(jì)算的成員名稱

類似 ES6 對(duì)象字面量擴(kuò)展的可計(jì)算屬性名稱,類也可以用[表達(dá)式]定義可計(jì)算成員名稱,包括類中的方法和訪問(wèn)器屬性:

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
// 訪問(wèn)器屬性
friend.sayName = 'lee'
console.log(friend.sayName) // lee

想進(jìn)一步熟悉對(duì)象新特性可參考: 【ES6】對(duì)象的新功能與解構(gòu)賦值

2.3 定義默認(rèn)迭代器

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

ES6 通過(guò)給Symbol.iterator屬性添加生成器的方式,定義默認(rèn)迭代器:

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

定義默認(rèn)迭代器后類的實(shí)例就可以使用for-of循環(huán)和展開(kāi)運(yùn)算符(...)等迭代功能。

對(duì)以上迭代器內(nèi)容感到困惑的可參考:【ES6】迭代器與可迭代對(duì)象

2.4 作為參數(shù)的類

類作為"一等公民”可以當(dāng)參數(shù)使用傳入函數(shù)中,當(dāng)然也可以從函數(shù)中返回:

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 創(chuàng)建單例

使用類語(yǔ)法創(chuàng)建單例的方式通過(guò)new立即調(diào)用類表達(dá)式:

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

這里先創(chuàng)建匿名類表達(dá)式,然后 new 調(diào)用這個(gè)類表達(dá)式,并通過(guò)小括號(hào)立即執(zhí)行,這種類語(yǔ)法創(chuàng)建的單例不會(huì)在作用域中暴露類的引用。

三、類的繼承

回顧 ES6 之前如何實(shí)現(xiàn)繼承?常用方式是通過(guò)原型鏈、構(gòu)造函數(shù)以及組合繼承等方式。

ES6 的類使用熟悉的extends關(guān)鍵字指定類繼承的函數(shù),并且可以通過(guò)surpe()方法訪問(wèn)父類的構(gòu)造函數(shù)。

例如繼承一個(gè) 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,術(shù)語(yǔ)上稱 Person 為基類,F(xiàn)riend 為派生類。

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

3.1 繼承內(nèi)建對(duì)象

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

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 的實(shí)例,subarr 也是派生類 MyArray 的實(shí)例,內(nèi)建對(duì)象繼承的實(shí)用之處是改變返回對(duì)象的類型。

瀏覽器引擎背后是通過(guò)[Symbol.species]屬性實(shí)現(xiàn)這一行為,它被用于返回函數(shù)的靜態(tài)訪問(wèn)器屬性,內(nèi)建對(duì)象定義了[Symbol.species]屬性的有 Array、ArrayBuffer、Set、Map、Promise、RegExp、Typed arrays。

3.2 繼承表達(dá)式的類

目前extends可以繼承類和內(nèi)建對(duì)象,但更強(qiáng)大的功能從表達(dá)式導(dǎo)出類!

這個(gè)表達(dá)式要求可以被解析為函數(shù)并具有[[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元屬性判斷函數(shù)是否通過(guò)new關(guān)鍵字調(diào)用。類的構(gòu)造函數(shù)也可以通過(guò)new.target確定類是如何被調(diào)用的。

可以通過(guò)new.target創(chuàng)建抽象類(不能實(shí)例化的類),例如:

class Abstract {
 constructor(){
  if(new.target === Abstract) {
   throw new Error('抽象類(不能直接實(shí)例化)')
  }
 }
}

class Instantiable extends Abstract {
 constructor() {
  super()
 }
}

// let abs = new Abstract() // Error: 抽象類(不能直接實(shí)例化)
 let abs = new Instantiable()
console.log(abs instanceof Abstract) // true

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

四、類的靜態(tài)成員

ES6 使用static關(guān)鍵字聲明靜態(tài)成員或方法。在類的方法或訪問(wèn)器屬性前都可以使用static,唯一的限制是不能用于構(gòu)造函數(shù)。

靜態(tài)成員的作用是某些類成員的私有化,及不可在實(shí)例中訪問(wèn),必須要直接在類訪問(wèn)。

class Person {
 constructor(name) {
  this.name = name;
 }

 static create(name) {
  return new Person(name);
 }
}

let beauty = Person.create("Jenny");
// beauty.create('lee') // TypeError

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

例如將上例的 Person 作為基類,派生出 Friend 類并使用基類的靜態(tài)方法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

可以看出派生類依然可以使用基類的靜態(tài)方法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間實(shí)例代碼

    JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間實(shí)例代碼

    JS中的 Date 對(duì)象用于處理日期和時(shí)間,Date對(duì)象和Math對(duì)象不一樣,Date是一個(gè)構(gòu)造函數(shù),需要實(shí)例化后才能使用對(duì)象中具體的方法和屬性。這篇文章主要給大家介紹了關(guān)于JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • 如何用threejs實(shí)現(xiàn)實(shí)時(shí)多邊形折射

    如何用threejs實(shí)現(xiàn)實(shí)時(shí)多邊形折射

    這篇文章主要介紹了如何用threejs實(shí)現(xiàn)實(shí)時(shí)多邊形折射,對(duì)three.js庫(kù)感興趣的同學(xué),可以參考下
    2021-05-05
  • js判斷手機(jī)和pc端選擇不同執(zhí)行事件的方法

    js判斷手機(jī)和pc端選擇不同執(zhí)行事件的方法

    這篇文章主要介紹了js判斷手機(jī)和pc端選擇不同執(zhí)行事件的方法,可實(shí)現(xiàn)判斷手機(jī)端還是PC端再選擇對(duì)應(yīng)的執(zhí)行事件的功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2015-01-01
  • Bootstrap圖片輪播組件Carousel使用方法詳解

    Bootstrap圖片輪播組件Carousel使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap圖片輪播組件Carousel使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件

    javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件

    這篇文章主要介紹了javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • ES6基礎(chǔ)之解構(gòu)賦值(destructuring assignment)

    ES6基礎(chǔ)之解構(gòu)賦值(destructuring assignment)

    這篇文章主要介紹了ES6基礎(chǔ)之解構(gòu)賦值(destructuring assignment),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 有道JavaScript監(jiān)聽(tīng)瀏覽器的問(wèn)題

    有道JavaScript監(jiān)聽(tīng)瀏覽器的問(wèn)題

    相信大家在web項(xiàng)目中,經(jīng)常會(huì)用到j(luò)avascript的事件監(jiān)聽(tīng)、事件冒泡這些東西。當(dāng)然也包括window.opener,window.showModalDialog這些父子窗口的互操作。
    2010-06-06
  • JS正則表達(dá)式驗(yàn)證密碼強(qiáng)度

    JS正則表達(dá)式驗(yàn)證密碼強(qiáng)度

    這篇文章主要為大家詳細(xì)介紹了JS正則表達(dá)式驗(yàn)證密碼強(qiáng)度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 聊一聊JS中this的指向問(wèn)題

    聊一聊JS中this的指向問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了聊一聊JS中this的指向問(wèn)題,幫助大家輕松了解JS中this的指向,感興趣的小伙伴們可以參考一下
    2016-06-06
  • JavaScript中的高級(jí)函數(shù)

    JavaScript中的高級(jí)函數(shù)

    在JavaScript中,函數(shù)的功能十分強(qiáng)大,除了函數(shù)相關(guān)的基礎(chǔ)知識(shí)外,掌握一些高級(jí)函數(shù)并應(yīng)用起來(lái),不僅能讓JS代碼看起來(lái)更為精簡(jiǎn),還可以提升性能,本文是小編總結(jié)的一些常用的、重要的函數(shù)
    2018-01-01

最新評(píng)論

望都县| 南安市| 麻城市| 浦东新区| 丰宁| 桂阳县| 镇巴县| 浦城县| 乌海市| 台中市| 柘城县| 张家川| 全州县| 柏乡县| 定兴县| 手游| 宜良县| 皮山县| 泽库县| 望奎县| 汝南县| 鄂尔多斯市| 禄丰县| 甘孜县| 酉阳| 宜兴市| 张家川| 凤冈县| 涞水县| 成都市| 通海县| 夏津县| 山阴县| 云浮市| 赤壁市| 米泉市| 桓台县| 安丘市| 鄯善县| 贺州市| 洛隆县|