首页 > 解决方案 > 访问派生类中使用 Wea​​kMap 定义的私有变量

问题描述

我正在使用常见的 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 的过程中肯定会帮助我

标签: javascriptinheritanceecmascript-6es6-classweakmap

解决方案


图书馆本身并不打算成为每个人都可以访问的公共图书馆,大多数其他队友可能不得不编辑其中的一部分,但他们仍然会尊重定义的模式/约定

根据您添加到问题中的真正尝试做的事情的描述,听起来这本身不是“安全”问题,而是您正在寻找适合您当地的最佳编程实现/约定将使用此接口的团队,以便其他开发人员清楚哪个状态是“受保护的”,并且只能在实现内部使用,而不是来自对象的外部消费者。

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

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

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

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

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


推荐阅读