【发布时间】:2016-04-03 17:21:11
【问题描述】:
注意:我已经完成了以下关于Symbols、WeekMaps 和地图的 SO 问题和 7 个答案(截至目前),请在投票前阅读完整问题:Private properties in JavaScript ES6 classes
文章:https://esdiscuss.org/topic/es7-property-initializers
下面是我的Simple Class,其中包含私有、公共和受保护的属性和方法。
'use strict';
class MyClass {
constructor () {
this.publicVar = 'This is Public Variable';
this.privateVar = 'This is Private Variable';
this.protectedVar = 'This is Protected Variable';
} // Public Constructor Method.
publicMethod () {
console.log(' Accessing this.publicVar: ', this.publicVar);
console.log(' Accessing this.privateVar: ', this.privateVar);
console.log(' Accessing this.protectedVar: ', this.protectedVar);
return 'Its Public Method'
} // Public Method.
privateMethod () {return 'Its Private Method'} // Private Method.
protectedMethod () {return 'Its Protected Method'} // Protected Method.
foo () {
this.publicMethod();
this.privateMethod();
this.protectedMethod();
} // Public Method
} // end class
我正在实例化对象并调用按预期工作的公共方法。
let MyObject = new MyClass;
MyObject.foo(); // Works fine.
console.log( MyObject.publicVar ); // Works
console.log( MyObject.publicMethod() ); // Works
按预期工作。
现在我的问题。我知道 ES6 规范中很少有像 Symbol 这样的东西,目前在 ES6 类上获得受保护和私有变量/方法的解决方法是什么。
console.log( MyObject.privateVar ); // Works
console.log( MyObject.privateMethod() ); // Works
我希望这个属性和方法只在它自己的类中可见。
console.log( MyObject.protectedVar ); // Works
console.log( MyObject.protectedMethod() ); // Works
我希望这个属性和方法在它自己的类和扩展它的类中可见。
赞赏解决方法/实现此行为的更好解决方案
【问题讨论】:
-
如果您已经阅读过 Symbols 和 WeakMap,您还需要了解什么?
-
我已经完成了这些,但希望该示例也可以作为限制和扩展类范围的答案
-
ES6 类没有故意私有/受保护:see here WeakMap/Symbols 更像是一种将它们添加到 ES6 类中的解决方法,但 ES6 类更多地是一种定义方法的方式,而不是用 Java 和 C# 等语言复制“经典”OO 类
标签: ecmascript-6 access-modifiers