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

React是構建交互式前端體驗的首選工具。 1)React通過組件化和虛擬DOM簡化UI開發。 2)組件分為函數組件和類組件,函數組件更簡潔,類組件提供更多生命週期方法。 3)React的工作原理依賴虛擬DOM和調和算法,提高性能。 4)狀態管理使用useState或this.state,生命週期方法如componentDidMount用於特定邏輯。 5)基本用法包括創建組件和管理狀態,高級用法涉及自定義鉤子和性能優化。 6)常見錯誤包括狀態更新不當和性能問題,調試技巧包括使用ReactDevTools和優

React是一個用於構建用戶界面的JavaScript庫,其核心是組件化和狀態管理。 1)通過組件化和狀態管理簡化UI開發。 2)工作原理包括調和和渲染,優化可通過React.memo和useMemo實現。 3)基本用法是創建並渲染組件,高級用法包括使用Hooks和ContextAPI。 4)常見錯誤如狀態更新不當,可使用ReactDevTools調試。 5)性能優化包括使用React.memo、虛擬化列表和CodeSplitting,保持代碼可讀性和可維護性是最佳實踐。

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。

React組件可以通過函數或類定義,封裝UI邏輯並通過props接受輸入數據。 1)定義組件:使用函數或類,返回React元素。 2)渲染組件:React調用render方法或執行函數組件。 3)復用組件:通過props傳遞數據,構建複雜UI。組件的生命週期方法允許在不同階段執行邏輯,提升開發效率和代碼可維護性。

React嚴格模式是一種開發工具,可通過激活其他檢查和警告來突出反應應用中的潛在問題。它有助於識別遺產代碼,不安全的生命週期和副作用,鼓勵現代反應實踐。

本文討論了React的對帳過程,詳細介紹了它如何有效地更新DOM。關鍵步驟包括觸發對帳,創建虛擬DOM,使用擴散算法以及應用最小的DOM更新。它還覆蓋了經家


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境

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

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