在ES5中,我可以这样写:
MyClass.prototype.value = (function() {
var privateVariable = 0;
return function() {
return ++privateVariable;
};
})();
但是在ES6中,我该怎么办?
class MyClass {
get value() {
// return ??
}
}
答案 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或模块中,或者对于本地范围而言都无关紧要,都是一样的。