在派生 class 中访问使用 Wea​​kMap 定义的私有变量

Accessing private variables defined with WeakMap inside a derived class

我正在使用常见的 WeakMaps 模式来模拟 es6 classes 中的私有变量,但我找不到拥有 "protected" 变量的方法,这意味着私有变量可以通过派生的 classes 访问,例如:

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;
})();

如果我使用相同的模式创建子class,我如何在子class中访问someProperty而不必在子getter中定义方法base class(因此完全破坏了为私有属性设置 weakmaps 的全部目的)?

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

库本身并不打算成为每个人都可以访问的 public 库,最多其他队友可能需要编辑其中的一部分,但他们仍然会尊重定义的 patterns/conventions

从安全的角度来看,大多数对其他 API 的请求都将通过单独的脚本处理有效负载验证来完成,所以我真正想要完成的是使可重用 Window classes可以在派生的 classes 中使用某种 "protected" 变量,因为它肯定会帮助我构建这种特定类型的 GUI

The library itself is not intended to be a public library for everyone to get access to, at most other team-mates might have to edit parts of it but they would still respect the defined patterns/conventions

根据您添加到问题中的对您真正尝试做的事情的描述,听起来这本身并不是 "security" 问题,而是您正在寻找最好的为将使用此接口的本地团队编程 implementation/convention,以便其他开发人员清楚哪个状态是 "protected" 并且仅在实现内部使用,而不是对象的外部使用者。

如果是这样,我将采用下划线约定,其中对象上以下划线开头的 属性 名称如 this._someProperty 仅供内部使用对象本身的方法(类似于 C++ 中的 "protected" 成员),而不供对象的消费者或用户在外部使用。

然后在实施文档中与您合作的团队进行口头沟通,确保每个人不仅理解您编写的代码中的约定,而且他们也可以在他们的代码中始终如一地使用相同的约定代码。

由于您在这里似乎没有实际的安全需求,因此使用这种类型的前导下划线的原因 "convention" 而不是更复杂的解决方案,这些解决方案可以为其他开发人员提供真正的数据保护(就像你试图做的那样):

  1. 实现更简单
  2. 没有性能下降
  3. 不干扰模块化和将派生 类 放在单独的文件中
  4. 无限扩展到尽可能多的属性,尽可能多类
  5. 更容易对与您一起工作的团队进行培训

一位资深开发人员曾与我分享过一句话"my code should be as simple as it can be to meet the objectives (correctness, stability, testability, maintainability, extensibility and reuse)"。这帮助我力求实现简单,避免超出实际需要的过度设计。