搜尋
首頁web前端前端問答修飾器是es6還是es7的特性

修飾器是es6還是es7的特性

Apr 13, 2022 pm 02:52 PM
es6es7修飾器

修飾器是es7特性。修飾器是ES7引入的一種與類別相關的語法,用來註解或修改類別和類別的方法,依賴ES5的「Object.defineProperty」方法,寫法為「@函數名稱」;它可以注入到類別、方法、屬性參數上來擴充類別、屬性、方法、參數的功能。

修飾器是es6還是es7的特性

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

什麼是修飾器

修飾器(Decorator)是ES7的語法,是一種與類別相關的語法,用來註解或修改類別和類別的方法。

它的出現能解決兩個問題:

  • 不同類別間共享方法

  • 編譯期對類別和方法的行為進行改變

修飾函數,寫成 @函數名稱。它可以放在類別和類別方法的定義前面,可以用來為類別、屬性或函數提供額外的功能。

@frozen class Foo {
  @configurable(false)
  @enumerable(true)
  method() {}
 
  @throttle(500)
  expensiveMethod() {}
}

上面一共用了四個裝飾器,一個用在類別本身,另外三個用在類別方法。

修飾器(Decorator) 也不是一個新的概念,其他語言比如Java,Python等已經很早就有了,ES7中的裝飾器(Decorator)借鑒了其他語言的寫法,不過依賴ES5的Object.defineProperty 方法。

類別的修飾

@testable
class MyTestableClass {
  // ...
}

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

MyTestableClass.isTestable // true

@testable就是裝飾器,它修改了MyTestableClass這個類別的行為,為它加上了靜態屬性isTestable。 testable函數的參數target是MyTestableClass類別本身。

@decorator
class A {}

// 等同于

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

也就是說,裝飾器是一個對類別進行處理的函數。裝飾器函數的第一個參數,就是要裝飾的目標類別。

如果想要實現新增多個參數的功能,可以在裝飾器外面再封裝一層函數。

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

@testable('MyTestableClass')
class MyTestableClass {}
MyTestableClass.name // MyTestableClass

@testable('MyClass')
class MyClass {}
MyClass.isTestable // MyClassf

上面範例是給類別新增一個靜態屬性。
如果想要新增實例屬性,可以透過目標類別的 Prototype物件操作。

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

// main.js
import { mixins } from './mixins'

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

@mixins(Foo)
class MyClass {}

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

實際開發中,react 與 Redux 函式庫結合使用時,常常需要寫成下面這樣。

class MyreactComponent extends React.Component {};

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

有了裝飾器,就可以改寫上面的程式碼。

@connect(mapStateToProps, mapDispatchToProps)
export default class MyReactComponent extends React.Component {};
注意,裝飾器對類別的行為的改變,是 程式碼編譯時發生的,而不是在執行時。這意味著,裝飾器能在編譯階段運行程式碼。也就是說,裝飾器本質就是編譯時執行的函數。

方法的修飾

class Person {
  // 用来装饰”类“的 name 方法
  @readonly
  name() { return `${this.first} ${this.last}` }
}

裝飾函數readonly總共可以接受三個參數。

function readonly(target, name, descriptor){
  // descriptor对象原来的值如下
  // {
  //   value: specifiedFunction,
  //   enumerable: false,
  //   configurable: true,
  //   writable: true
  // };
  descriptor.writable = false;
  return descriptor;
}

readonly(Person.prototype, 'name', descriptor);
// 类似于
Object.defineProperty(Person.prototype, 'name', descriptor);
  • 裝飾器第一個參數是類別的原型對象,上例是Person.prototype,裝飾器的本意是要「裝飾」類別的實例,但是這個時候實例還沒生成,所以只能去裝飾原型(這不同於類別的裝飾,那種情況時target參數指的是類別本身)
  • 第二個參數是所要裝飾的屬性名稱
  • 第三個參數是該屬性的描述物件

裝飾器還有註解的作用,例如上面我們可以一眼看出上面name的方法是唯讀的。

除了註釋,裝飾器還能用來類型檢查。所以,對於類別來說,這項功能相當有用。長期來看,它將是 JavaScript 程式碼靜態分析的重要工具。在TypeScript裡已做為一項實驗性特性予以支援。

為什麼裝飾器不能用於函數

裝飾器只能用於類別和類別的方法,不能用於函數,因為存在函數提升。

var counter = 0;

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

@add
function foo() {}

上面的程式碼,意圖是執行後counter等於 1,但其實結果是counter等於 0。因為函數提升,使得實際執行的程式碼是下面這樣。

@add
function foo() {
}

var counter;
var add;

counter = 0;

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

總之,由於存在函數提升,使得裝飾器不能用於函數。類別是不會提升的,所以就沒有這方面的問題。

core-decorators.js

[core-decorators.js]()是一個第三方模組,提供了幾個常見的裝飾器。

  • @autobind:使得方法中的this對象,綁定原始物件
  • #@readonly:使得屬性或方法不可寫。
  • @override:檢查子類別的方法,是否正確覆寫了父類別的同名方法,如果不正確會報錯。
  • @deprecate (別名@deprecated):在控制台顯示一條警告,表示該方法將廢除。

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

以上是修飾器是es6還是es7的特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
CSS:使用ID選擇器不好嗎?CSS:使用ID選擇器不好嗎?May 13, 2025 am 12:14 AM

使用ID選擇器在CSS中並非固有地不好,但應謹慎使用。 1)ID選擇器適用於唯一元素或JavaScript鉤子。 2)對於一般樣式,應使用類選擇器,因為它們更靈活和可維護。通過平衡ID和類的使用,可以實現更robust和efficient的CSS架構。

HTML5:2024年的目標HTML5:2024年的目標May 13, 2025 am 12:13 AM

html5'sgoalsin2024focusonrefinement和optimization,notNewFeatures.1)增強performanceandeffipedroptimizedRendering.2)inviveAccessibilitywithRefinedwithRefinedTributesAndEllements.3)explityconcerns,尤其是withercercern.4.4)

HTML5試圖改進的主要領域是什麼?HTML5試圖改進的主要領域是什麼?May 13, 2025 am 12:12 AM

html5aimedtotoimprovewebdevelopmentInfourKeyAreas:1)多中心供應,2)語義結構,3)formcapabilities.1)offlineandstorageoptions.1)html5intoryements html5introctosements introdements and toctosements and toctosements,簡化了inifyingmediaembedingmediabbeddingingandenhangingusexperience.2)newsements.2)

CSS ID和類:常見錯誤CSS ID和類:常見錯誤May 13, 2025 am 12:11 AM

IDsshouldbeusedforJavaScripthooks,whileclassesarebetterforstyling.1)Useclassesforstylingtoallowforeasierreuseandavoidspecificityissues.2)UseIDsforJavaScripthookstouniquelyidentifyelements.3)Avoiddeepnestingtokeepselectorssimpleandimproveperformance.4

課程和ID選擇器之間的差異是什麼?課程和ID選擇器之間的差異是什麼?May 12, 2025 am 12:13 AM

classSelectorSareVersAtileAndReusable,whileIdSelectorSareEctorAreNiqueAndspecific.1)USECLASSSELECTORS(表示)forStylingmultilemtsswithsharedCharacteristics.2)UseIdSelectors.2)UseIdSelectors(eustotedBy#)

CSS IDS vs類:真正的差異CSS IDS vs類:真正的差異May 12, 2025 am 12:10 AM

IDSareuniqueIdentifiersForsingLelements,而LileclassesstyLemultiplelements.1)useidsforuniquelementsand andjavascripthooks.2)useclassesforporporporblesable,flexiblestylestylestylinglingactossmultiplelements。

CSS:如果我只使用課程怎麼辦?CSS:如果我只使用課程怎麼辦?May 12, 2025 am 12:09 AM

使用僅類選擇器可以提高代碼的重用性和可維護性,但需要管理類名和優先級。 1.提高重用性和靈活性,2.組合多個類創建複雜樣式,3.可能導致冗長類名和優先級問題,4.性能影響微小,5.遵循最佳實踐如簡潔命名和使用約定。

CSS中的ID和類選擇器:初學者指南CSS中的ID和類選擇器:初學者指南May 12, 2025 am 12:06 AM

ID和class選擇器在CSS中分別用於唯一和多元素的樣式設置。 1.ID選擇器(#)適用於單一元素,如特定導航菜單。 2.Class選擇器(.)用於多元素,如統一按鈕樣式。應謹慎使用ID,避免過度特異性,並優先使用class以提高樣式複用性和靈活性。

See all articles

熱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

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

熱門文章

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

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