詳解如何在JavaScript中使用裝飾器
Decorator裝飾器是ES7的時(shí)候提案的特性,目前處于Stage 3候選階段(2022年10月)。
裝飾器簡(jiǎn)單來(lái)說(shuō)就是修改類(lèi)和類(lèi)方法的語(yǔ)法糖,很多面向?qū)ο笳Z(yǔ)言都有裝飾器這一特性。
為了使用裝飾器特性,我們需要用進(jìn)行babel轉(zhuǎn)義。這里需要用到的是@babel/plugin-proposal-decorators。
安裝
npm install --save-dev @babel/plugin-proposal-decorators
vite配置
import { defineConfig } from 'vite';
import babel from 'vite-plugin-babel';
export default defineConfig({
plugins: [
babelDev({
babelConfig: {
plugin: ['@babel/plugin-proposal-decorators']
}
}),
// ...
],
// ...
})webpack配置
module: {
rules: [
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
use: {
loader: 'babel-loader',
options: {
// ...
plugins: [
['@babel/plugin-proposal-decorators', { 'legacy': true }],
// ...
],
// ...
},
}
// ...
}
]
} 使用
先來(lái)一圖了解裝飾器語(yǔ)法。

語(yǔ)法: @+函數(shù)名
@frozen
class Foo {
@throttle(500)
expensiveMethod() {}
}類(lèi)裝飾器
參數(shù)target是類(lèi)本身
function testable(target) {
target.isTestable = true;
}
@testable
class MyTestableClass {
// ...
}
MyTestableClass.isTestable // true
帶參數(shù)的修飾器
@+返回裝飾器函數(shù)的表達(dá)式
function testable(isTestable) {
return function(target) {
target.isTestable = isTestable;
}
}
@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true
@testable(false)
class MyClass {}
MyClass.isTestable // false
類(lèi)成員裝飾器
參數(shù):
- target:被修飾的類(lèi)的原型對(duì)象
- name:類(lèi)成員的名字
- descriptor:類(lèi)成員的描述對(duì)象
function readonly(target, name, descriptor){
// descriptor對(duì)象原來(lái)的值如下
// {
// value: specifiedFunction,
// enumerable: false,
// configurable: true,
// writable: true
// };
descriptor.writable = false;
return descriptor;
}
class Person {
@readonly
name() { return `${this.first} ${this.last}` }
}多個(gè)裝飾器的執(zhí)行順序
洋蔥模型,先從外到內(nèi)進(jìn)入,然后由內(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
應(yīng)用
延遲
class Page {
@delay(2000)
onClick(a) {
console.log("onClick");
}
}
function delay(time) {
return function (target, key, descriptor) {
const oldFunction = descriptor.value;
descriptor.value = function() {
setTimeout(() => {
oldFunction.apply(this, arguments);
}, time);
}
return descriptor;
}
}
節(jié)流
如果在定時(shí)器的時(shí)間范圍內(nèi)再次觸發(fā),則不予理睬,等當(dāng)前定時(shí)器完成,才能啟動(dòng)下一個(gè)定時(shí)器任務(wù)。
class Page {
@throttle(2000)
onClick(a) {
console.log("onClick");
}
}function throttle(time) {
return function (target, key, descriptor) {
const oldFunction = descriptor.value;
let isLock = false;
descriptor.value = function() {
if(isLock) { return; }
isLock = true;
oldFunction.apply(this, arguments);
setTimeout(() => {
isLock = false;
}, time);
}
return descriptor;
}
}防抖
每次事件觸發(fā)則刪除原來(lái)的定時(shí)器,建立新的定時(shí)器。
class Page {
@debounce(2000)
onClick(a) {
console.log("onClick");
}
}function debounce(time) {
return function (target, key, descriptor) {
const oldFunction = descriptor.value;
let timer = null;
descriptor.value = function () {
clearTimeout(timer);
timer = setTimeout(() => {
oldFunction.apply(this, arguments)
}, time);
};
return descriptor;
}
}到此這篇關(guān)于詳解如何在JavaScript中使用裝飾器的文章就介紹到這了,更多相關(guān)JavaScript使用裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript基本數(shù)據(jù)類(lèi)型和轉(zhuǎn)換
本文主要介紹了javascript的基本數(shù)據(jù)類(lèi)型和轉(zhuǎn)換,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
通過(guò)隱藏iframe實(shí)現(xiàn)無(wú)刷新上傳文件操作
本文給大家介紹iframe無(wú)刷新上傳文件,通過(guò)一個(gè)隱藏的iframe來(lái)處理上傳操作我采用的是ReactJS,amazeui,nodejs1.html target指向iframe的name,就是把上傳后的操作交給iframe來(lái)處理2016-03-03
js獲取系統(tǒng)的根路徑實(shí)現(xiàn)介紹
js如何獲取系統(tǒng)的根路徑,在本文給出了詳細(xì)的方法,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-09-09
JavaScript裝飾器函數(shù)(Decorator)實(shí)例詳解
這篇文章主要介紹了JavaScript裝飾器函數(shù)(Decorator),結(jié)合實(shí)例形式分析了JavaScript裝飾器函數(shù)(Decorator)的功能、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2017-03-03
JavaScript程序設(shè)計(jì)高級(jí)算法之動(dòng)態(tài)規(guī)劃實(shí)例分析
這篇文章主要介紹了JavaScript程序設(shè)計(jì)高級(jí)算法之動(dòng)態(tài)規(guī)劃,結(jié)合實(shí)例形式分析了javascript動(dòng)態(tài)規(guī)劃算法的原理、實(shí)現(xiàn)技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-11-11
當(dāng)鼠標(biāo)移出灰色區(qū)域時(shí)候,菜單項(xiàng)怎么隱藏起來(lái)
當(dāng)鼠標(biāo)移出灰色區(qū)域時(shí)候,菜單項(xiàng)怎么隱藏起來(lái)...2007-11-11
JS實(shí)現(xiàn)“全選”和"全不選"功能代碼實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)“全選”和"全不選"功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

