国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

你是怎么理解ES6中 Decorator 的?使用場景?

這篇具有很好參考價值的文章主要介紹了你是怎么理解ES6中 Decorator 的?使用場景?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結出來的一些知識,希望對大家有所幫助

你是怎么理解ES6中 Decorator 的?使用場景?

一、介紹

Decorator,即裝飾器,從名字上很容易讓我們聯(lián)想到裝飾者模式

簡單來講,裝飾者模式就是一種在不改變原類和使用繼承的情況下,動態(tài)地擴展對象功能的設計理論。

ES6Decorator功能亦如此,其本質也不是什么高大上的結構,就是一個普通的函數(shù),用于擴展類屬性和類方法

這里定義一個士兵,這時候他什么裝備都沒有

class soldier{ 
}

定義一個得到 AK 裝備的函數(shù),即裝飾器

function strong(target){
    target.AK = true
}

使用該裝飾器對士兵進行增強

@strong
class soldier{
}

這時候士兵就有武器了

soldier.AK // true

上述代碼雖然簡單,但也能夠清晰看到了使用Decorator兩大優(yōu)點:

  • 代碼可讀性變強了,裝飾器命名相當于一個注釋
  • 在不改變原有代碼情況下,對原來功能進行擴展

二、用法

Docorator修飾對象為下面兩種:

  • 類的裝飾
  • 類屬性的裝飾

類的裝飾

當對類本身進行裝飾的時候,能夠接受一個參數(shù),即類本身

將裝飾器行為進行分解,大家能夠有個更深入的了解

@decorator
class A {}

// 等同于

class A {}
A = decorator(A) || A;

下面@testable就是一個裝飾器,target就是傳入的類,即MyTestableClass,實現(xiàn)了為類添加靜態(tài)屬性

@testable
class MyTestableClass {
  // ...
}

function testable(target) {
  target.isTestable = true;
}

MyTestableClass.isTestable // true

如果想要傳遞參數(shù),可以在裝飾器外層再封裝一層函數(shù)

function testable(isTestable) {
  return function(target) {
    target.isTestable = isTestable;
  }
}

@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true

@testable(false)
class MyClass {}
MyClass.isTestable // false

類屬性的裝飾

當對類屬性進行裝飾的時候,能夠接受三個參數(shù):

  • 類的原型對象
  • 需要裝飾的屬性名
  • 裝飾屬性名的描述對象

首先定義一個readonly裝飾器

function readonly(target, name, descriptor){
  descriptor.writable = false; // 將可寫屬性設為false
  return descriptor;
}

使用readonly裝飾類的name方法

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}

相當于以下調用

readonly(Person.prototype, 'name', descriptor);

如果一個方法有多個裝飾器,就像洋蔥一樣,先從外到內(nèi)進入,再由內(nèi)到外執(zhí)行

function dec(id){
    console.log('evaluated', id);
    return (target, property, descriptor) =>console.log('executed', id);
}

class Example {
    @dec(1)
    @dec(2)
    method(){}
}
// evaluated 1
// evaluated 2
// executed 2
// executed 1

外層裝飾器@dec(1)先進入,但是內(nèi)層裝飾器@dec(2)先執(zhí)行

注意

裝飾器不能用于修飾函數(shù),因為函數(shù)存在變量聲明情況

var counter = 0;

var add = function () {
  counter++;
};

@add
function foo() {
}

編譯階段,變成下面

var counter;
var add;

@add
function foo() {
}

counter = 0;

add = function () {
  counter++;
};

意圖是執(zhí)行后counter等于 1,但是實際上結果是counter等于 0

三、使用場景

基于Decorator強大的作用,我們能夠完成各種場景的需求,下面簡單列舉幾種:

使用react-redux的時候,如果寫成下面這種形式,既不雅觀也很麻煩

class MyReactComponent extends React.Component {}

export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);

通過裝飾器就變得簡潔多了

@connect(mapStateToProps, mapDispatchToProps)
export default class MyReactComponent extends React.Component {}

mixins,也可以寫成裝飾器,讓使用更為簡潔了

function mixins(...list) {
  return function (target) {
    Object.assign(target.prototype, ...list);
  };
}

// 使用
const Foo = {
  foo() { console.log('foo') }
};

@mixins(Foo)
class MyClass {}

let obj = new MyClass();
obj.foo() // "foo"

下面再講講core-decorators.js幾個常見的裝飾器

@antobind

autobind裝飾器使得方法中的this對象,綁定原始對象

import { autobind } from 'core-decorators';

class Person {
  @autobind
  getPerson() {
    return this;
  }
}

let person = new Person();
let getPerson = person.getPerson;

getPerson() === person;
// true

@readonly

readonly裝飾器使得屬性或方法不可寫

import { readonly } from 'core-decorators';

class Meal {
  @readonly
  entree = 'steak';
}

var dinner = new Meal();
dinner.entree = 'salmon';
// Cannot assign to read only property 'entree' of [object Object]

@deprecate

deprecatedeprecated裝飾器在控制臺顯示一條警告,表示該方法將廢除文章來源地址http://www.zghlxwxcb.cn/news/detail-838652.html

import { deprecate } from 'core-decorators';

class Person {
  @deprecate
  facepalm() {}

  @deprecate('功能廢除了')
  facepalmHard() {}
}

let person = new Person();

person.facepalm();
// DEPRECATION Person#facepalm: This function will be removed in future versions.

person.facepalmHard();
// DEPRECATION Person#facepalmHard: 功能廢除了

參考文獻

  • https://es6.ruanyifeng.com/#docs/decorator

到了這里,關于你是怎么理解ES6中 Decorator 的?使用場景?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • ES6基礎知識六:你是怎么理解ES6中 Promise的?使用場景?

    ES6基礎知識六:你是怎么理解ES6中 Promise的?使用場景?

    一、介紹 Promise,譯為承諾,是異步編程的一種解決方案,比傳統(tǒng)的解決方案(回調函數(shù))更加合理和更加強大 在以往我們?nèi)绻幚矶鄬赢惒讲僮?,我們往往會像下面那樣編寫我們的代碼 閱讀上面代碼,是不是很難受,上述形成了經(jīng)典的回調地獄 現(xiàn)在通過Promise的改寫上面的

    2024年02月15日
    瀏覽(22)
  • ES6基礎知識八:你是怎么理解ES6中Proxy的?使用場景?

    ES6基礎知識八:你是怎么理解ES6中Proxy的?使用場景?

    一、介紹 定義: 用于定義基本操作的自定義行為 本質: 修改的是程序默認形為,就形同于在編程語言層面上做修改,屬于元編程(meta programming) 元編程(Metaprogramming,又譯超編程,是指某類計算機程序的編寫,這類計算機程序編寫或者操縱其它程序(或者自身)作為它們的

    2024年02月15日
    瀏覽(28)
  • ES6基礎知識七:你是怎么理解ES6中 Generator的?使用場景?

    ES6基礎知識七:你是怎么理解ES6中 Generator的?使用場景?

    一、介紹 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同 回顧下上文提到的解決異步的手段: 回調函數(shù) promise 那么,上文我們提到promsie已經(jīng)是一種比較流行的解決異步方案,那么為什么還出現(xiàn)Generator?甚至async/await呢? 該問題我們留在后面再

    2024年02月15日
    瀏覽(23)
  • ES6基礎知識五:你是怎么理解ES6新增Set、Map兩種數(shù)據(jù)結構的?

    ES6基礎知識五:你是怎么理解ES6新增Set、Map兩種數(shù)據(jù)結構的?

    如果要用一句來描述,我們可以說 Set是一種叫做集合的數(shù)據(jù)結構,Map是一種叫做字典的數(shù)據(jù)結構 什么是集合?什么又是字典? 集合 是由一堆無序的、相關聯(lián)的,且不重復的內(nèi)存結構【數(shù)學中稱為元素】組成的組合 字典 是一些元素的集合。每個元素有一個稱作key 的域,不同

    2024年02月16日
    瀏覽(19)
  • JS 怎么理解ES6新增Set、Map兩種數(shù)據(jù)結構?

    JS 怎么理解ES6新增Set、Map兩種數(shù)據(jù)結構?

    目錄 一、前言 二、Set 1.Set數(shù)據(jù)結構定義 2.Set數(shù)據(jù)結構的特性 3.Set數(shù)據(jù)結構的基本使用 4.Set遍歷數(shù)據(jù) 5.Set 的使用場景 6.WeakSet的使用 7.垃圾回收機制 三、Map 1.Map數(shù)據(jù)結構定義 2.Map數(shù)據(jù)結構的特性 3.Map數(shù)據(jù)結構的基本使用 ?4.Map遍歷數(shù)據(jù) 5.Map的使用場景 6.WeakMap的使用 7.垃圾回收

    2024年02月08日
    瀏覽(27)
  • ES6 reduce方法:示例與詳解、應用場景

    ES6 reduce方法:示例與詳解、應用場景

    還是大劍師蘭特 :曾是美國某知名大學計算機專業(yè)研究生,現(xiàn)為航空航海領域高級前端工程師;CSDN知名博主,GIS領域優(yōu)質創(chuàng)作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技術開發(fā),歡迎加底部微信(gis-dajianshi),一起交流。 No. 內(nèi)容鏈接 1 Openlayers 【入門教

    2024年04月13日
    瀏覽(24)
  • 深入理解 ES6 的解構表達式

    深入理解 ES6 的解構表達式

    還是大劍師蘭特 :曾是美國某知名大學計算機專業(yè)研究生,現(xiàn)為航空航海領域高級前端工程師;CSDN知名博主,GIS領域優(yōu)質創(chuàng)作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技術開發(fā),歡迎加底部微信(gis-dajianshi),一起交流。 No. 內(nèi)容鏈接 1 Openlayers 【入門教

    2024年04月13日
    瀏覽(24)
  • 【深入理解ES6】塊級作用域綁定

    【深入理解ES6】塊級作用域綁定

    提升(Hoisting)機制:通過var聲明的變量,都會被當成在當前作用域頂部生命的變量。 JavaScript引擎會將上面的getValue函數(shù)修改為下面這樣。變量value的聲明被提升至函數(shù)頂部,初始化操作依舊保留在原處執(zhí)行。為此,ES6引入了塊級作用域來強化對變量聲明周期的控制。

    2024年02月12日
    瀏覽(17)
  • 【深入理解ES6】字符串和正則表達式

    字符串(String)是JavaScript6大原始數(shù)據(jù)類型。其他幾個分別是Boolean、Null、Undefined、Number、Symbol(es6新增)。 字符串里的字符有兩種: 前??個碼位均以16位的編碼單元表示的BMP字符(基本多文種平面。 超過??的UTF-16引入了代理對,以兩個編碼單元32位表示輔助平面字符。 ES5中

    2024年02月13日
    瀏覽(26)
  • ES6 中 Symbol 怎么用?示例詳解

    ES6 中 Symbol 怎么用?示例詳解

    還是大劍師蘭特 :曾是美國某知名大學計算機專業(yè)研究生,現(xiàn)為航空航海領域高級前端工程師;CSDN知名博主,GIS領域優(yōu)質創(chuàng)作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技術開發(fā),歡迎加底部微信(gis-dajianshi),一起交流。 No. 內(nèi)容鏈接 1 Openlayers 【入門教

    2024年04月22日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包