访问派生类中用WeakMap定义的私有变量

时间:2018-12-11 22:18:53

标签: javascript inheritance ecmascript-6 es6-class weakmap

我正在使用常见的WeakMaps模式来仿真es6类中的私有变量,但是我找不到找到“受保护”变量的方法,这意味着私有变量可以通过派生类访问,例如:

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方法(从而完全破坏了为私有属性设置弱映射的全部目的) ?

如果没有使用这种模式的优雅解决方案,那么最好的行动方案是什么? 我正在构建一个Web应用程序,该应用程序可以具有显示各种产品的各种“分层窗口”,这些应用程序是从不同的脚本加载的,该脚本很少向.php端点发出请求以收集此信息。

图书馆本身并不是要成为每个人都可以使用的公共图书馆,大多数其他队友可能不得不编辑其中的一部分,但他们仍然会尊重已定义的模式/惯例

从安全的角度来看,对其他API的大多数请求将通过单独的脚本来处理有效负载的验证,因此,我真正想完成的工作是使可重用的Window类可以使用某种“受保护的”变量,因为它肯定会在构建这种特定类型的GUI的过程中为我提供帮助

1 个答案:

答案 0 :(得分:2)

  

图书馆本身并不是要成为每个人都可以使用的公共图书馆,大多数其他队友可能不得不编辑其中的一部分,但他们仍然会尊重已定义的模式/惯例

从您对问题所做的实际尝试的描述来看,听起来这本身并不是一个“安全”问题,但是您正在寻找最佳的编程实现/约定对于将使用此接口的本地团队,以便其他开发人员可以清楚知道哪个状态处于“受保护”状态,并且只能在实现内部使用,而不能从对象的外部使用者使用。

如果是这种情况,我将遵循下划线约定,其中this._someProperty中以下划线开头的对象上的属性名称仅用于对象本身方法中的内部使用(类似于C ++中的“受保护”成员),而不供对象的使用者或用户外部使用。

然后在实现的文档中和与您工作的团队进行口头交流,以确保每个人不仅了解您编写的代码中的约定,而且还可以在他们的代码中始终使用相同的约定。

由于这里似乎没有实际的安全需求,所以选择这种类型的领先的下划线“约定”的原因,而不是提供更多真正保护其他开发人员数据保护的解决方案(例如正在尝试这样做):

  1. 实施更简单
  2. 没有性能下降
  3. 不干扰模块化并将派生类放在单独的文件中
  4. 可无限扩展到许多属性,许多类
  5. 更容易教育与您合作的团队如何做

一位高级开发人员曾经与我分享一句话,那就是“我的代码应该尽可能简单地满足目标(正确性,稳定性,可测试性,可维护性,可扩展性和重用性)”。这帮助我努力实现实现的简单性,避免了超出实际需求的过度设计。