在派生 class 中访问使用 WeakMap 定义的私有变量
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" 而不是更复杂的解决方案,这些解决方案可以为其他开发人员提供真正的数据保护(就像你试图做的那样):
- 实现更简单
- 没有性能下降
- 不干扰模块化和将派生 类 放在单独的文件中
- 无限扩展到尽可能多的属性,尽可能多类
- 更容易对与您一起工作的团队进行培训
一位资深开发人员曾与我分享过一句话"my code should be as simple as it can be to meet the objectives (correctness, stability, testability, maintainability, extensibility and reuse)"。这帮助我力求实现简单,避免超出实际需要的过度设计。
我正在使用常见的 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" 而不是更复杂的解决方案,这些解决方案可以为其他开发人员提供真正的数据保护(就像你试图做的那样):
- 实现更简单
- 没有性能下降
- 不干扰模块化和将派生 类 放在单独的文件中
- 无限扩展到尽可能多的属性,尽可能多类
- 更容易对与您一起工作的团队进行培训
一位资深开发人员曾与我分享过一句话"my code should be as simple as it can be to meet the objectives (correctness, stability, testability, maintainability, extensibility and reuse)"。这帮助我力求实现简单,避免超出实际需要的过度设计。