Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在派生类中访问用WeakMap定义的私有变量_Javascript_Inheritance_Ecmascript 6_Es6 Class_Weakmap - Fatal编程技术网

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

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)) {

我正在使用common 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方法(从而完全违背了为私有属性创建weakmap的全部目的)

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

该库本身并不打算成为每个人都可以访问的公共库,最多其他队友可能需要编辑其中的部分内容,但他们仍然会遵守定义的模式/约定

从安全的角度来看,对其他API的大多数请求都是通过一个单独的脚本来处理有效负载的验证,所以我真正想做的是使可重用的
Window
类可以使用某种“受保护的”变量跨派生类,因为它肯定会帮助我构建这种特定类型的GUI

该库本身并不打算成为每个人都可以访问的公共库,最多其他队友可能需要编辑其中的部分内容,但他们仍然会遵守定义的模式/约定

从您在问题中添加的对您真正想要做的事情的描述来看,听起来这本身并不是一个“安全”问题,而是您在为将使用此接口的本地团队寻找最佳编程实现/约定,以便其他开发人员清楚哪个状态是“受保护的”并且仅用于实现内部,而不用于对象的外部使用者

如果是这样的话,我只想使用下划线约定,即对象上的属性名称以下划线开头,如
this.\u someProperty
仅用于对象本身的方法中的内部使用(类似于C++中的“受保护”成员),而不用于对象的使用者或用户的外部使用

然后在实现的文档中进行沟通,并与您的团队进行口头沟通,以确保每个人不仅理解您编写的代码中的约定,而且能够在代码中始终使用相同的约定

由于您在这里似乎没有实际的安全需求,因此使用这种主要的下划线“约定”而不是更复杂的解决方案来保护数据不受其他开发人员的影响(如您尝试的做法)的原因如下:

  • 实现更简单
  • 没有性能下降
  • 不影响模块化和将派生类放在单独的文件中
  • 无限扩展到尽可能多的属性和类
  • 更容易教育与您一起工作的团队如何做到这一点
  • 一位高级开发人员曾与我分享过这样一句话:“我的代码应该尽可能简单,以满足目标(正确性、稳定性、可测试性、可维护性、可扩展性和重用)”。这帮助我在实现上力求简单,避免过度设计,超出实际需要

    该库本身并不打算成为每个人都可以访问的公共库,最多其他队友可能需要编辑其中的部分内容,但他们仍然会遵守定义的模式/约定

    从您在问题中添加的对您真正想要做的事情的描述来看,听起来这本身并不是一个“安全”问题,而是您在为将使用此接口的本地团队寻找最佳编程实现/约定,以便其他开发人员清楚哪个状态是“受保护的”并且仅用于实现内部,而不用于对象的外部使用者

    如果是这样的话,我只想使用下划线约定,即对象上的属性名称以下划线开头,如
    this.\u someProperty
    仅用于对象本身的方法中的内部使用(类似于C++中的“受保护”成员),而不用于对象的使用者或用户的外部使用

    然后在实现的文档中进行沟通,并与您的团队进行口头沟通,以确保每个人不仅理解您编写的代码中的约定,而且能够在代码中始终使用相同的约定

    由于您在这里似乎没有实际的安全需求,因此使用这种主要的下划线“约定”而不是更复杂的解决方案来保护数据不受其他开发人员的影响(如您尝试的做法)的原因如下:

  • 实现更简单
  • 没有性能下降
  • 不影响模块化和将派生类放在单独的文件中
  • 无限扩展到尽可能多的属性和类
  • 更容易教育与您一起工作的团队如何做到这一点

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

    派生类必须能够访问
    \u private
    变量,以便能够访问weakMap对象。如果你想