Javascript 在派生类中访问用WeakMap定义的私有变量
我正在使用common WeakMaps模式来模拟es6类中的私有变量,但是我找不到一种方法来拥有“受保护”的变量,这意味着可以通过派生类访问的私有变量,例如:Javascript 在派生类中访问用WeakMap定义的私有变量,javascript,inheritance,ecmascript-6,es6-class,weakmap,Javascript,Inheritance,Ecmascript 6,Es6 Class,Weakmap,我正在使用common WeakMaps模式来模拟es6类中的私有变量,但是我找不到一种方法来拥有“受保护”的变量,这意味着可以通过派生类访问的私有变量,例如: var Window = (function() { const _private = new WeakMap(); const internal = (key) => { // Initialize if not created if (!_private.has(key)) {
var Window = (function() {
const _private = new WeakMap();
const internal = (key) => {
// Initialize if not created
if (!_private.has(key)) {
_private.set(key, {});
}
// Return private properties object
return _private.get(key);
};
class Window {
constructor() {
// creates a private property
internal(this).someProperty = "value";
}
}
return Window;
})();
如果我使用相同的模式创建一个子类,我如何访问子类中的someProperty
,而不必在基类中定义getter方法(从而完全违背了为私有属性创建weakmap的全部目的)
如果使用这种模式没有优雅的解决方案,那么最好的行动方案是什么?
我正在构建一个webapp,它可以有各种“分层窗口”,显示各种产品,从不同的脚本加载,该脚本很少向.php端点发出请求来收集这些信息
该库本身并不打算成为每个人都可以访问的公共库,最多其他队友可能需要编辑其中的部分内容,但他们仍然会遵守定义的模式/约定
从安全的角度来看,对其他API的大多数请求都是通过一个单独的脚本来处理有效负载的验证,所以我真正想做的是使可重用的Window
类可以使用某种“受保护的”变量跨派生类,因为它肯定会帮助我构建这种特定类型的GUI
该库本身并不打算成为每个人都可以访问的公共库,最多其他队友可能需要编辑其中的部分内容,但他们仍然会遵守定义的模式/约定
从您在问题中添加的对您真正想要做的事情的描述来看,听起来这本身并不是一个“安全”问题,而是您在为将使用此接口的本地团队寻找最佳编程实现/约定,以便其他开发人员清楚哪个状态是“受保护的”并且仅用于实现内部,而不用于对象的外部使用者
如果是这样的话,我只想使用下划线约定,即对象上的属性名称以下划线开头,如this.\u someProperty
仅用于对象本身的方法中的内部使用(类似于C++中的“受保护”成员),而不用于对象的使用者或用户的外部使用
然后在实现的文档中进行沟通,并与您的团队进行口头沟通,以确保每个人不仅理解您编写的代码中的约定,而且能够在代码中始终使用相同的约定
由于您在这里似乎没有实际的安全需求,因此使用这种主要的下划线“约定”而不是更复杂的解决方案来保护数据不受其他开发人员的影响(如您尝试的做法)的原因如下:
this.\u someProperty
仅用于对象本身的方法中的内部使用(类似于C++中的“受保护”成员),而不用于对象的使用者或用户的外部使用
然后在实现的文档中进行沟通,并与您的团队进行口头沟通,以确保每个人不仅理解您编写的代码中的约定,而且能够在代码中始终使用相同的约定
由于您在这里似乎没有实际的安全需求,因此使用这种主要的下划线“约定”而不是更复杂的解决方案来保护数据不受其他开发人员的影响(如您尝试的做法)的原因如下:
一位高级开发人员曾与我分享过这样一句话:“我的代码应该尽可能简单,以满足目标(正确性、稳定性、可测试性、可维护性、可扩展性和重用)”。这帮助我在实现上力求简单,避免过度设计超出实际需要。派生类必须能够访问
\u private
变量,以便能够访问weakMap对象。如果你想