首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候执行类型记录/js装饰器?

什么时候执行类型记录/js装饰器?
EN

Stack Overflow用户
提问于 2017-11-28 20:25:18
回答 1查看 830关注 0票数 6

装修师什么时候被处决?

代码语言:javascript
复制
class Person {
    @SomeDecorator
    age
}
  1. 当我创建一个Person实例时
  2. 当Person类被解析时

静态特性呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 00:22:25

在定义类时,属性装饰器会提前执行。您不需要构造实例,也不需要访问属性。

示例:这会记录age,而不需要构造Person类。如果属性是静态的,则同样适用。

代码语言:javascript
复制
function SomeDecorator(a, b) {
    console.log(b);
}

class Person {
    @SomeDecorator
    public age: number;
}

如果您是在链接到get并在属性上设置操作之后--这也是可能的。下面是Pro TypeScript (第二版)列表中的一个示例。它通过包装getter和setter来工作。

代码语言:javascript
复制
function log(target: any, key: string) {
    let value = target[key];

    // Replacement getter
    const getter = function () {
        console.log(`Getter for ${key} returned ${value}`);
        return value;
    };

    // Replacement setter
    const setter = function (newVal) {
        console.log(`Set ${key} to ${newVal}`);
        value = newVal;
    };

    // Replace the property
    if (delete this[key]) {
        Object.defineProperty(target, key, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}

class Calculator {
    @log
    public num: number;

    square() {
        return this.num * this.num;
    }
}

console.log('Construct');
const calc = new Calculator();

console.log('Set');
// Set num to 4
calc.num = 4;

console.log('Get');
// Getter for num returned 4
// Getter for num returned 4
calc.square();

这个清单的输出是:

代码语言:javascript
复制
Construct (manual log)

Set (manual log)

-> Set num to 4

Get (manual log)

-> Getter for num returned 4

-> Getter for num returned 4
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47540318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档