修飾器是一個對類進行處理的函數。修飾器函數的第一個參數,就是所要修飾的目標類。
修飾器的行爲:
@decorator class A {} // 等同於 class A {} A = decorator(A) || A;
@testable:修改了類的行爲,爲它加上了靜態屬性isTestable
isTestable
@testable class MyTestableClass { // ... } //target是MyTestableClass類自己 function testable(target) { target.isTestable = true; } MyTestableClass.isTestable // true
若是以爲一個參數不夠用,能夠在修飾器外面再封裝一層函數。javascript
function testable(isTestable) { return function(target) { target.isTestable = isTestable; } } @testable(true) class MyTestableClass {} MyTestableClass.isTestable // true @testable(false) class MyClass {} MyClass.isTestable // false
若是想添加實例屬性,能夠經過目標類的prototype
對象操做。java
function testable(target) { target.prototype.isTestable = true; } @testable class MyTestableClass {} let obj = new MyTestableClass(); obj.isTestable // true
修飾器不只能夠修飾類,還能夠修飾類的屬性。
修飾器不只能夠修飾類,還能夠修飾類的屬性。
class Person { @readonly name() { return `${this.first} ${this.last}` } }
修飾器函數readonly
一共能夠接受三個參數:app
函數@log
修飾器,能夠起到輸出日誌的做用。
class Math { @log add(a, b) { return a + b; } } function log(target, name, descriptor) { var oldValue = descriptor.value; descriptor.value = function() { console.log(`Calling ${name} with`, arguments); return oldValue.apply(this, arguments); }; return descriptor; } const math = new Math(); // passed parameters should get logged now math.add(2, 4);
修飾器有註釋的做用。測試
@testable class Person { @readonly @nonenumerable name() { return `${this.first} ${this.last}` } } //Person類是可測試的,而name方法是隻讀和不可枚舉的。
修飾器只能用於類和類的方法,不能用於函數,由於存在函數提高。
是一個第三方模塊,提供了幾個常見的修飾器,經過它能夠更好地理解修飾器。this
模式(略)Trait 也是一種修飾器,效果與 Mixin 相似,可是提供更多功能spa
目前,Babel 轉碼器已經支持 Decorator。