JavaScript的Python装饰器

Python decorator for JavaScript

本文关键字:Python JavaScript      更新时间:2023-09-26

我正在寻找JavaScript中等效的Python装饰器(即@property),但我不确定如何做到这一点。

class Example:
    def __init__(self):
        self.count = 0
        self.counts = []
        for i in range(12):
            self.addCount()
    def addCount(self):
        self.counts.append(self.count)
        self.count += 1
    @property
    def evenCountList(self):
        return [x for x in self.counts if x % 2 == 0]

    example = Example()
    example.evenCountList # [0, 2, 4, 6, 8, 10]

我如何在JavaScript中做到这一点?

显然在Javascript中不存在这种确切的语法,但是有一个方法Object.defineProperty,它可以用来实现非常类似的东西。基本上,这个方法允许您为特定对象创建一个新属性,并且作为所有可能性的一部分,定义用于计算值的getter方法。

下面是一个简单的例子。

var example = {
    'count': 10
};
Object.defineProperty(example, 'evenCountList', {
    'get': function () {
        var numbers = [];
        for (var number = 0; number < this.count; number++) {
            if(number % 2 === 0) {
                numbers.push(number);
            }
        }
        return numbers;
    }
});

就像@property可以有setter一样,Object.defineProperty也可以。您可以通过阅读MDN上的文档来检查所有可能的选项。