首頁 web前端 前端問答 es6 裝飾器怎麼理解

es6 裝飾器怎麼理解

Jan 03, 2023 pm 04:14 PM
es6 裝飾器

在es6中,裝飾者模式是一種在不改變原類別和使用繼承的情況下,動態地擴展物件功能的設計理論;裝飾者其本質就是一個普通的函數,用於擴展類別屬性和類別方法。使用裝飾器的優點:1.程式碼可讀性變強了,裝飾器命名相當於一個註解;2、在不改變原有程式碼情況下,對原來功能進行擴充。

es6 裝飾器怎麼理解

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

怎麼理解ES6中 Decorator 的?

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

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

ES6中Decorator功能也是如此,其本質也不是什麼高大上的結構,就是一個普通的函數,用來擴展類別屬性和類別方法

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

class soldier{ 
}
登入後複製

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

function strong(target){
    target.AK = true
}
登入後複製

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

@strong
class soldier{
}
登入後複製

這時候士兵就有武器了

soldier.AK // true
登入後複製

上述程式碼雖然簡單,但也能夠清楚地看到了使用Decorator(裝飾器)兩大優點:

  • 程式碼可讀性變強了,裝飾器命名相當於一個註解

  • 在不改變原有程式碼情況下,對原來功能進行擴充

裝飾器的用法

Docorator修飾物件為下面兩種:

  • 類別的裝飾

  • 類別屬性的裝飾

類別的裝飾

#當對類別本身進行裝飾的時候,能夠接受一個參數,也就是類別本身

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

@decorator
class A {}

// 等同于

class A {}
A = decorator(A) || A;
登入後複製

下面@testable就是一個裝飾器,target就是傳入的類,即MyTestableClass,實作了為類別新增靜態屬性

@testable
class MyTestableClass {
  // ...
}

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

MyTestableClass.isTestable // true
登入後複製

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

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

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

@testable(false)
class MyClass {}
MyClass.isTestable // false
登入後複製

類別屬性的裝飾

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

  • #類別的原型物件

  • 需要裝飾的屬性名稱

  • 裝飾屬性名的描述物件

#首先定義一個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);
登入後複製

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

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)先進入,但內層裝飾器@dec(2)先執行

注意

裝飾器不能用來修飾函數,因為函數存在變數宣告情況

var counter = 0;

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

@add
function foo() {
}
登入後複製

編譯階段,變成下面

var counter;
var add;

@add
function foo() {
}

counter = 0;

add = function () {
  counter++;
};
登入後複製

意圖是執行後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

#deprecate或deprecated裝飾器在控制台顯示一條警告,表示該方法將廢除

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: 功能废除了
登入後複製

【相關推薦:javascript影片教學web前端

以上是es6 裝飾器怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

ES6怎麼求數組反轉 ES6怎麼求數組反轉 Oct 26, 2022 pm 06:19 PM

在ES6中,可以利用數組物件的reverse()方法來實現數組反轉,該方法用於顛倒數組中元素的順序,將最後一個元素放在第一位,而第一個元素放在最後,語法「array.reverse()」。 reverse()方法會修改原始數組,如果不想修改需要配合擴充運算子「...」使用,語法「[...array].reverse()」。

async是es6還是es7的 async是es6還是es7的 Jan 29, 2023 pm 05:36 PM

async是es7的。 async和await是ES7中新增內容,是對於非同步操作的解決方案;async/await可以說是co模組和生成器函數的語法糖,用更清晰的語意解決js非同步程式碼。 async顧名思義是「非同步」的意思,async用於聲明一個函數是異步的;async和await有一個嚴格規定,兩者都離不開對方,且await只能寫在async函數中。

小程式為什麼要將es6轉es5 小程式為什麼要將es6轉es5 Nov 21, 2022 pm 06:15 PM

為了瀏覽器相容。 ES6作為JS的新規範,加入了許多新的語法和API,但現代瀏覽器對ES6新特性支援不高,所以需將ES6程式碼轉換為ES5程式碼。在微信web開發者工具中,會預設使用babel將開發者ES6語法程式碼轉換為三端都能很好支援的ES5的程式碼,幫助開發者解決環境不同所帶來的開發問題;只需要在專案中配置勾選好「ES6轉ES5」選項即可。

es6怎麼找出2個數組中不同項 es6怎麼找出2個數組中不同項 Nov 01, 2022 pm 06:07 PM

步驟:1、將兩個陣列分別轉換為set類型,語法「newA=new Set(a);newB=new Set(b);」;2、利用has()和filter()求差集,語法“ new Set([...newA].filter(x =>!newB.has(x)))”,差集元素會被包含在一個set集合中返回;3、利用Array.from將集合轉為數組類型,語法“Array.from(集合)”。

es5和es6怎麼實現陣列去重 es5和es6怎麼實現陣列去重 Jan 16, 2023 pm 05:09 PM

es5中可以利用for語句和indexOf()函數來實現數組去重,語法“for(i=0;i<數組長度;i++){a=newArr.indexOf(arr[i]);if(a== -1){...}}」。在es6中可以利用擴充運算子、Array.from()和Set來去重;需要先將陣列轉為Set物件來去重,然後利用擴充運算子或Array.from()函數來將Set物件轉回數組即可。

es6暫時性死區是什麼意思 es6暫時性死區是什麼意思 Jan 03, 2023 pm 03:56 PM

在es6中,暫時性死區是語法錯誤,是指let和const命令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。

Python中的裝飾器和上下文管理器是如何運作的? Python中的裝飾器和上下文管理器是如何運作的? Oct 20, 2023 pm 07:04 PM

Python中的裝飾器和上下文管理器是如何運作的?在Python中,裝飾器和上下文管理器是兩個非常有用的概念和功能。它們都是為了簡化程式碼、增加程式碼可讀性以及方便程式碼的重複使用。一、裝飾器裝飾器是Python中一種用來修改函數的行為的特殊函數。它允許我們在不修改原始函數的情況下進行包裝或拓展。裝飾器在許多Python的框架和庫中被廣泛使用,例如Flask、Dj

使用上下文裝飾器調試Pytorch的記憶體洩漏問題 使用上下文裝飾器調試Pytorch的記憶體洩漏問題 Apr 10, 2023 am 11:31 AM

裝飾器是 python 上下文管理器的特定實作。本片文章將透過一個pytorch GPU 偵錯的範例來說明如何使用它們。雖然它可能不適用於所有情況,但我它們卻非常有用。調試記憶體洩漏問題有很多方法可以調試記憶體洩漏。本文將展示一種識別程式碼中有問題的行的有用方法。此方法可以有助於以簡潔的方式找到具體的位置。逐行手動調試如果遇到問題,一種經典的且常用的方法是使用調試器逐行檢查,例如下面的例子:在搜尋引擎中查找有關如何計算pytorch 中所有張量總數的程式碼片段,例如:tensor -counter-s

See all articles