如何在ES6的getter中编写闭包函数?

时间:2018-07-03 09:28:18

标签: ecmascript-6 closures

在ES5中,我可以这样写:

MyClass.prototype.value = (function() {
    var privateVariable = 0;
    return function() {
        return ++privateVariable;
    };
})();

但是在ES6中,我该怎么办?

class MyClass {
    get value() {
        // return ??
    }
}

2 个答案:

答案 0 :(得分:1)

与ES6类无关的直接对应项:

class MyClass {}
MyClass.prototype.value = (() => {
    let privateVariable = 0;
    return function() {
        return ++privateVariable;
    };
})();

没有实际的原因可以使privateVariable在外部范围内完全不可用,尤其是因为它在ES6类中不能很好地使用。由于privateVariable无法进行反射,因此不能认为这是正确的封装。它也不能充当受保护的成员。

可以有一个私有成员来存储值:

class MyClass {
    constructor() {
         this._value = 0;
    }

    value() {
        return ++this._value;
    }
}

它可能是一个符号,但这并不能使类的设计更加安全,只是在另一个模块中继承了一个类时会带来更多的复杂性:

// should be carried around everywhere to make the class extendable
export const VALUE = Symbol('value');

class MyClass {
    constructor() {
         this[VALUE] = 0;
    }

    value() {
        return ++this[VALUE];
    }
}

请注意,get value() {}value() {}并不相同。

TypeScript(这是ECMAScript的超集)的一个优点是在编译时强制执行了封装。

答案 1 :(得分:1)

等效于ES5

function MyClass() {}
var privateVariable = 0;
MyClass.prototype = {
    get value() {
        return ++privateVariable;
    }
};

在ES6 class语法中将是

let privateVariable = 0;
class MyClass {
    get value() {
        return ++privateVariable;
    }
}

无论是否将所有内容都放在IEFE或模块中,或者对于本地范围而言都无关紧要,都是一样的。