ES6代理类,访问私有属性(无法从类未声明的对象中读取私有成员#hidden)

2024-03-11

我正在研究代理对象、类和私有属性。 并遇到了这个错误消息:

/home/marc/projects/playground/pipeline/clsss.js:14
        this.#hidden = !this.#hidden;
                             ^

TypeError: Cannot read private member #hidden from an object whose class did not declare it
    at Proxy.toggle (/home/marc/projects/playground/pipeline/clsss.js:14:30)
    at Object.<anonymous> (/home/marc/projects/playground/pipeline/clsss.js:37:19)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47

重现代码:

class Parent {

    #hidden;

    constructor() {
        this.#hidden = false;
    }

    get hidden() {
        return this.#hidden;
    }

    toggle() {
        this.#hidden = !this.#hidden;
        console.log("Changed", this.#hidden)
        return this.#hidden;
    }

}


const p = new Parent();
const proxy = new Proxy(p, {
    get: (target, prop, receiver) => {
        return target[prop];
    }
});

console.log(p.toggle())
console.log(proxy.toggle())  // this is the problem
console.log(p.toggle())

有没有办法处理代理类实例上的私有属性?

为什么这不适用于代理?

感谢您的任何提示/答案。

编辑:在github上发现了一个相关问题:https://github.com/tc39/proposal-class-fields/issues/106 https://github.com/tc39/proposal-class-fields/issues/106我发现的一个快速技巧是使用:

const proxy = new Proxy(..., {
    get: (target, prop, receiver) => {

        // bind context to original object
        if (target[prop] instanceof Function) {
            return target[prop].bind(p);
        }

        return target[prop];

    }
});

但这似乎非常不干净/错误。


如果这是所需的行为,您可以将该方法绑定到构造函数上:

constructor() {
      this.#hidden = false;
      this.toggle = this.toggle.bind(this);
}

Demo:

class Parent {

    #hidden;

    constructor() {
        this.#hidden = false;
        this.toggle = this.toggle.bind(this);
    }

    get hidden() {
        return this.#hidden;
    }

    toggle() {
        this.#hidden = !this.#hidden;
        console.log("Changed", this.#hidden)
        return this.#hidden;
    }

}


const p = new Parent();
const proxy = new Proxy(p, {
    get: (target, prop, receiver) => {
        return target[prop];
    }
});

console.log(p.toggle())
console.log(proxy.toggle())  // this is the problem
console.log(p.toggle())

否则你可以代理类本身:

class Parent {

    #hidden;

    constructor() {
        this.#hidden = false;
    }

    get hidden() {
        return this.#hidden;
    }

    toggle() {
        this.#hidden = !this.#hidden;
        //console.log("Changed", this.#hidden)
        return this.#hidden;
    }

}


const p = new Parent();
const ParentProxy = new Proxy(Parent, {
    get(target, prop, receiver) {
        return target[prop];
    }
});

const p2 = new ParentProxy();

console.log('p toggle:', p.toggle());
console.log('p2 toggle:', p2.toggle());  //
//console.log(proxy.toggle())  // this is the problem
console.log('p toggle:', p.toggle());
console.log('p2 toggle:', p2.toggle());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6代理类,访问私有属性(无法从类未声明的对象中读取私有成员#hidden) 的相关文章

  • 如何更改传单弹出窗口的背景颜色?

    我正在使用 Leafletjs 创建地图 我想将弹出窗口 当前显示图像和链接 的背景颜色从白色更改为其他颜色 看起来基本的背景颜色 CSS 语法并不能解决这个问题 有什么建议吗 谢谢 斯科特 调用 leaflet css 后 您可以包含
  • 优化 Web 应用程序开发策略

    如今 许多网络应用程序正在使用它们自己无法使用的 API 或代码 并且通常使用效率低下 我想到了一些谷歌地图混搭 对于 php asp 后端 HTML javascript 尤其是现在所有的 AJAX 存在许多潜在的瓶颈 问题 低效率和双重
  • 在 jQuery 中将一列的内容复制到另一列

    下面的 jQuery 非常慢 约 7 秒 我显然做错了 我正在尝试复制列的内容col到专栏0在 HTML 表格中 所以如果 col 是 2 那么我需要将第 2 列复制到第 0 列 for var i 0 i lt 31 i grid tr
  • 禁用浏览器状态栏文本

    背景 现代浏览器取消了经典的状态栏 而是在窗口底部绘制一个小工具提示 在悬停 焦点时显示链接目标 下面的屏幕截图说明了这种行为的示例 在我的例子中是不需要的 问题 有没有一种可移植的方法来禁用这些工具提示 在我的特殊情况下 我是否遗漏了这样
  • 每个对象? [复制]

    这个问题在这里已经有答案了 我在 JavaScript 中有对象 var object someobject Object aaa true bbb true ccc true 我该如何使用每一个呢 object each function
  • 使用 AngularJS ng-bind-html 时从 json 数据获取 img src

    所以我有一个有趣的问题 但我还没有找到答案 假设我从 JSON 文件中获得了一堆数据 但不知何故 其中一个主要字段如下所示 description img src http o aolcdn com hss storage midas 37
  • Javascript 单元测试 - DOM 操作

    我对 Javacript 单元测试很陌生 有件事一直困扰着我 在测试 javascript 时 我们经常需要进行 DOM 操作 看起来我正在对控制器 组件中的方法 函数进行单元测试 但我仍然需要依赖模板中的 HTML 元素 一旦 id 或在
  • 支持 Javascript 链式关系运算符吗?

    我只是尝试了一些 JS 核心原则 发现引擎评估链式关系运算符时不会抛出错误 相反 他们以一种我自己无法理解的方式进行评估 console log 1 lt 2 lt 3 lt 4 lt 5 true expected console log
  • Node JS 如何将图像和请求数据一起 POST 到另一个服务器/api

    我正在尝试将图像从 Node JS 应用程序发布到另一个 REST API 我在 Mongo DB 中有图像 作为二进制数组数据 由 Node JS 读取 然后应该发布到另一个 API 我面临的问题是如何将请求数据与图像一起发送 我有这个原
  • Ace Editor 获取当前选定的行号和文本

    我目前正在使用 Ace Editor 但我在文档中找不到与检索当前所选行号及其文本相关的任何内容 有任何想法吗 首先 定义 选定行 ace 中的选择可以跨多行设置 如果您的意思是 未设置选择 当前行是光标闪烁的行 var currline
  • YouTube iframe 不响应 postMessage 命令

    我正在尝试使用来自父级的 postMessage 命令来控制 YouTube iframe 但它似乎不起作用 由于多种原因 我没有使用 YouTube API 只是使用带有 YouTube 嵌入视频的普通 iframe 我尝试发送命令的方式
  • “Backbone.js 视图”中的单击事件不起作用

    我尝试开始使用backbone js 但我发现当我不使用 body 作为视图的el时 该事件不起作用 这是代码 您可以将其另存为 html 文件并运行
  • 有没有办法覆盖 Google 路线服务缩放值?

    我使用下面的代码来获取两点之间的路线 directionsService route request function response status if status google maps DirectionsStatus OK di
  • Angular:将数据从工厂 ajax 调用传递回我的控制器

    我一直在使用 Angular 并且已经从使用本地数据 似乎工作正常 转向尝试通过工厂中的 ajax 调用来填充我的视图 这是代码 div h2 Get data using a Factory h2 div div div
  • 使用递归获取嵌套对象中的所有父对象

    我有以下对象 const object id 1 name a children id 2 name b children id 3 name c id 4 name d 我需要一个接受对象和最后一个子对象的
  • 查找数组中是否有任何项目符合条件

    我是 JavaScript 新手 现在 我有一个包含多个对象的数组 因此 我想迭代它 如果任何对象与条件匹配 那么我想返回一个值并停止该循环 我的 obj 数组就像 var obj type numberOfQuestions techno
  • `[$injector:nomod] 模块“google-maps”不可用`

    我正在使用 angular google maps 在角度应用程序中处理谷歌地图 为此 我必须添加angular google maps js到项目 如果我按以下方式添加脚本 该页面可以正常工作 不会出现任何错误 但如果我使用本地副本 它将
  • 如何在浏览器调整大小时调整div大小

    是的 所以我不使用粘性页脚 而是决定创建一个 jQuery 函数来更改 mainContent div 的大小 以便页脚可以很好地适应 基本上我想做的是 mainContent height 100 40px Where footer he
  • FB.logout() - 无访问令牌 - “以不同用户身份登录”

    这个问题与这个问题相关 在没有访问令牌的情况下调用 FB logout https stackoverflow com questions 8430474 fb logout called without an access token 1
  • 如何在 Mongoose 中设置文档创建的 TTL 日期?

    我正在尝试做一个promoCodeMongoose 中的架构 创建时 我需要能够设置促销代码的到期日期 促销代码不一定相同TTL 我在看这个问题 https stackoverflow com questions 14597241 sett

随机推荐

  • 在单例模式中使用 CDI

    我正在尝试将记录器对象注入到按照单例方法实现的类中 代码几乎是这样的 Logger class public class LoggerFactory Produces public Logger getLogger InjectionPoi
  • Apollo 客户端:网络错误 {"type":"WriteError"}

    我正进入 状态Network Error type WriteError 关于我的阿波罗查询 查询在到达客户端时执行得很好 但将其写入存储时存在问题 任何想法可能会出什么问题吗 这是查询 fragment BpmnProcessInstan
  • 在 R 中提取 URL 参数和值

    我们想要从给定的 URL 中提取参数和值 例如 http www exemple com a 1 b 2 c 3 def 使用 xml2 url parse 我们能够将 url 解析为其组成部分 然而 我们仍然希望使用 gsub 匹配正则表
  • Sketch 中的 Material Design 插件:如何导出生成的主题?

    我们正在使用Material Design 主题编辑器 https material io tools theme editor Sketch 中的插件 它在您的 Sketch 文件中创建了这个令人惊叹的样式指南和材料设计主题 有谁知道如何
  • Xcode 不允许我上传我的应用程序

    我有一个用 Cordova 创建的 iOS 应用程序 并且刚刚向 Apple 支付了 99 美元以将其上传到 App Store 我已经创建了应用程序存档 但在管理器中Upload to App Store 呈灰色显示 并且显示 分发需要注
  • 如何在CSS中用页面的完整高度填充div? (页面高度超过100%)ajax加载gif背景

    好吧 有几个类似的问题 但不完全是我想要的 我在页面上有几个ajax请求 我想在屏幕中央显示图像 并且一切正常 为了让它看起来更突出 我想将该图像放置在具有半透明背景的 div 上 这样对于最终用户来说更明显 现在是棘手的部分 我用 css
  • 如何将div放入文本框内

    在 SO 上提问的一部分是输入标签 当您键入标签并单击它时 文本框中会出现一个 div 至少我认为正在发生这种情况 我如何将 div 放入这样的文本框中 目前我只能使用以下命令将文本框的值更改为下拉项 JQUERY item display
  • 如何在 SLIME 的 REPL 中获得 Common Lisp 的语法高亮显示?

    我想学习 Common Lisp 并通过 emacs 包管理器安装了 emacs 24 3 和 slime 在 slime REPL 语法高亮中不起作用 另一方面 当我启动 Lisp Mode 在 slime REPL 中 时 表达式的值不
  • 有没有办法在 nextjs 中保持页面刷新时的路由器查询

    我有一个带有动态网址的动态页面 一切都是客户端渲染的 这是link链接到第二页 dashboard orderdetail query id orderID as dashboard orderDetails orderNo 这可以很好地将
  • C# 读取字节数组

    好的 我正在构建服务器 客户端应用程序 基本上服务器接收一个包含 header 2bytes cryptokeys 2bytes 和数据的数据包 我正在考虑构建类以将整个数据包 字节 加载到其中 然后使用内部类方法处理数据包 现在回答问题
  • 在 C# 中将本地时区转换为 PST 时区

    假设我现在系统中的时区是 5 GMT 现在在我的机器上01 14 2012 05 52PM我想将其转换为 PST 时区 例如 1 14 12 4 52 50 AM PST 反之亦然 太平洋标准时间 PST 至格林尼治标准时间 GMT Tim
  • 如何从列表列表中删除 nan? [复制]

    这个问题在这里已经有答案了 我试图从列表列表中删除所有 nan 我的数据如下 1 2 3 nan nan nan 4 5 nan 9 8 7 6 5 4 3 nan nan nan nan nan 我尝试从这里的答案中做到这一点 如何从列表
  • 将最后一个有效索引掩码应用于数据帧以获取最后一个有效值

    我有一个如下所示的数据框 s1 s2 s3 s4 0 v1 v2 v3 v4 0 v5 v6 v7 np nan 0 v8 np nan v9 np nan 0 v10 np nan np nan np nan 本质上从上到下有数值 并且跨
  • 视图在呈现后被 UITransitionView 阻止[重复]

    这个问题在这里已经有答案了 我有一个侧面导航控制器并通过 UIButton 呈现它 当我直接将此 NC 设为根视图控制器时 self presentviewcontroller NC animated YES completion nil
  • 值中每第 n 个字符添加逗号

    我的问题很简单 我从 sql select 中获取一个值 如下所示 ARAMAUBEBABRBGCNDKDEEEFOFIFRGEGRIEISITJPYUCAKZKG 我需要这样的 AR AM AU BE BA BR BG CN DK DE
  • 带有 PIL 的 Pyinstaller。导入错误:无法导入名称 _imaging

    我在运行包含枕头的已编译可执行文件时遇到问题 我使用了 pyinstaller 它似乎编译得很好 但是运行 exe 后 会抛出错误 似乎与引用 imaging 而不是 Image 存在冲突 首先 我觉得很奇怪pillow如何安装到PIL目录
  • 使用 PHP/JavaScript 链接获取有关网站访问者的信息

    有人试图对我进行网络钓鱼 他们假装是我的亲密朋友之一来羞辱我们俩 此人创建了一个虚假的电子邮件帐户 冒充此人 并试图从我这里获取个人信息 我和我的朋友确认这不是他 现在我们正在努力找出他是谁 我想向他们发送一个指向某种 PHP 或 JS 页
  • 如何将 OpenAPI 2.0 转换为 OpenAPI 3.0? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何工具 库可以将 OpenAPI 2 0 定义转换为 OpenAPI 3 0 而无需每行一个
  • RDF 读取/解析错误

    我有一些 RDF 文件 我想将其导入到 tripplestore AllegroGraph 中 但在第一个文件中 我收到 SAX 解析器错误 指出存在无法识别的字符 删除有问题的行后 一切都很好 然后我尝试使用 W3C RDF 验证器和带有
  • ES6代理类,访问私有属性(无法从类未声明的对象中读取私有成员#hidden)

    我正在研究代理对象 类和私有属性 并遇到了这个错误消息 home marc projects playground pipeline clsss js 14 this hidden this hidden TypeError Cannot