问题标签 [es6-proxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
320 浏览

javascript - 在 ES6 代理完成其“获取”序列后执行一个函数?

我有一个 ES6 代理,其中包含其他深度嵌套的代理(在根代理的 get 陷阱中生成)。它们都使用相同的陷阱处理程序。

当我尝试获取此集合中深层嵌套对象的值时,会为遇到的每个深层嵌套对象调用 getter。在获取序列完成后,必须知道通过对象的所谓“路径”的记录。例如,调用:

是两个 get 操作的“链”,shallowdeep顺序排列,这两个操作都被推送到一个数组,充当链中访问的属性的面包屑路径,例如:

不过,这有一个问题。在任何获取序列中,都不可能知道链中的最终获取是什么 - 对代理的每次获取都被视为原子操作,因此没有关于最后被调用的属性的内在概念。这意味着在随后的“获取链”中,path数组已经有与之关联的值。我在下面编写了一些代码来说明我的代理的结构和我遇到的问题:

所以我想知道的是:是否有可能以某种方式知道链中的最后一个“获取”是什么,和/或是否有办法在获取链完成时调用函数?

谢谢您的帮助!

0 投票
2 回答
1764 浏览

javascript - 使用 Reflect.defineProperty 而不是 Object.defineProperty 会更好吗?

将 eslint 与 React 配置一起使用时,我使用Object.defineProperty. 错误说:

避免使用Object.defineProperty,而是使用Reflect.defineProperty. (喜欢反映)

在优选反射的 eslint文档中,他们说它已被弃用,原因是:

这条规则的初衷现在似乎被误导了,因为我们已经开始理解,Reflect方法实际上并不是要替换Object规则建议的对应物,而是作为低级原语存在,与代理一起使用,以复制默认行为各种以前存在的功能。

那么我的问题是:使用Reflect.defineProperty而不是有什么优势Object.defineProperty吗?

0 投票
2 回答
48 浏览

javascript - 检测调用的对象何时被调用。访问器或作为函数调用

我有以下对象

如果我说o()我希望调用被代理,fn并且如果我说o.a应该返回 a 的值,是否可能完全按照它的呈现方式?

它更像是一个对象的未命名默认函数

0 投票
0 回答
122 浏览

angular - Angular 模板中的 ES6 代理

我在我的 Angular 应用程序中使用 RxDB(本质上是 using 的包装器)pouchdbrxjs数据库中的每个文档(称为RxDocument)都是一个 ES6 代理。例如,我可以拥有并且RxDocument喜欢这样:

但是,当我尝试在 Angular 模板中引用这个 getter 时,它会导致浏览器选项卡崩溃,因为 NgZone 吓坏了。例如:

如何以不破坏 Angular 更改检测功能的方式引用代理值?

0 投票
1 回答
561 浏览

javascript - 在javascript中为代理添加(递归?)级别意识

我试图通过使用代理覆盖我的对象 getter 来打印出正在通过 getter 访问哪些节点。我试图基本上测试这个大对象的哪些部分没有被我的应用程序使用。我遇到的问题是能够添加一些方法来识别吸气剂父母是什么。这是我到目前为止所拥有的

这非常适合向我展示道具键 - 但它只是第一级的键。我不确定如何使用此代理来解决此问题,因为此单个函数会覆盖所提供对象中的所有代理。有没有办法可能传递对象父母/孩子?可能我也错误地处理了这个问题 - 所以我正在寻找任何输入。谢谢!

0 投票
0 回答
2481 浏览

javascript - 如何从领域对象代理列表中获取纯 JavaScript 数组?

设想:

例如,您在 realm-js 中将模式定义为:

您已经创建了一个对象Business并保存到 Realm。然后在其他地方查询了这个对象。并且您想将此字段复制number_of_stores_in_cities到 javascript 数组js_number_of_store_in_cities以进行进一步处理。

我的期望: Realm 定义了处理程序来获取整个目标列表,我可以简单地将number_of_stores_in_cities.all()number_of_stores_in_cities.getList()称为Proxy

我所拥有的:似乎他们没有按照我的期望定义这些处理程序。并且它们的 getter 是基于数组的索引定义的。所以这个代理number_of_stores_in_cities的工作方式与 javascript 数组完全一样。我试图将条目一一复制number_of_stores_in_citiesjs_number_of_stores_in_cities. 我也试过了const js_number_of_stores_in_cities = Array.prototype.slice.call(number_of_stores_in_cities)。然而,这两种方法都出乎意料地慢,以至于它们需要大约 10 秒来复制长度为 2500 的列表。

我需要什么:除了使用这些传统的 javascript 数组方法之外,有没有一种方法可以让我Proxy快速从 我需要为此提供我的处理程序Proxy吗?

在此处输入图像描述

0 投票
4 回答
840 浏览

javascript - ES6 代理:set() 陷阱未触发,在目标对象的方法内设置时

例子:

为什么会这样?即使从目标对象内部,如何触发陷阱?

编辑,主要是为了向@Bergi解释这一点:

我的主要目标是拦截对 foo 对象的任何更改,因此我可以将属性(例如 foo.changed)设置为 true。另外,我想拦截对具有数组/对象类型的 foo 属性的更改。你知道,如果我设置 foo 的属性,一切都很好,但是当我推送到一个数组时,代理无法拦截它。所以我也需要将数组/对象属性转换为代理(我称它们为 ArrayProxy 和 ObjectProxy)。

这是我的代码(打字稿):

我已经删除了代码,这并不重要(例如对象属性和 ObjectProxy 的类似情况)。

如果有更优雅的方式来做我所做的事情,我将非常感激。

0 投票
0 回答
440 浏览

javascript - 我应该如何使用 ES6 代理将我的代码更改为链生成器函数?

在过去的几天里,我花了很多时间来让我的代码工作,但我不能让它工作!

我想要完成的是使用 es6 代理链接生成器函数,如下所示。似乎我可以将这些列表操作函数添加到生成器原型中,但我想使用代理来代替我的学习目的。

我最终想要实现的东西

任何人都可以看看我下面的代码并告诉我我做错了什么以及如何解决这个问题吗?

谢谢!!

我的代码

现在,我想让这部分工作

0 投票
2 回答
1023 浏览

javascript - 如何使用代理来观察变量是否(不再)未定义

请原谅我的n00bility ...我正在尝试使用代理在全局var阶段不再未定义之后执行一些代码。这是我天真的尝试:

```

```

显然,我误解了代理的工作原理,但我尝试了各种方案,但都不起作用。将未定义阶段作为目标传递给代理不起作用(Cannot create proxy with a non-object as target or handler出现错误)。在这种情况下如何使用代理?为什么在实例化之前我不能observe使用代理的未定义阶段,然后执行回调?

供参考:

Stage var 是全局变量,我无法控制它(它在某些时候由 create.js 实例化)。所有代码都从 UMD 模块执行。我正在使用打字稿(转译为 es5)。Object.defineProperty() 在我的浏览器中可用。此外,阶段(createjs.Stage 类型)在实例化时确实包含不同类型的 setter/getter,这在使用 typescript 时会出现问题。

0 投票
2 回答
867 浏览

node.js - 为什么我的函数代理没有在 Node 中被调用?

我使用代理get方法很好。然后我尝试在一个函数上使用它并很快意识到我需要使用该apply方法。这个简单的例子不起作用。它从不进入应用。

Node 看起来支持 apply https://node.green/#ES2015-built-ins-Proxy--apply--handler。不知道我做错了什么。

Magic.foo我直接尝试和通过ProxyObject.assign来查看它是否需要成为自己的对象。都没有奏效。