当前位置: 首页 > 面试题库 >

监视所有JavaScript对象属性(神奇的getter和setter)

唐炳
2023-03-14
问题内容

如何在JavaScript中模拟PHP风格的__get()和__set()魔术获取器/设置器?许多人说这目前是不可能的。我几乎可以肯定,这是有可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情。

我知道您可以利用get和set,但是当您不确定属性名称是什么时,这些将无法使用。例如,
如果您希望在创建新属性时执行事件处理程序,该 怎么办?

我想做的例子:

var obj = {};
notify(obj, function(key, value) {
   //key is now the name of the property being set.
   //value is the value of the property about to be set
   console.log("setting " + key + " to " + value);
});
obj.foo = 2; //prints "setting foo to 2"
obj.bar = {a: 2}; //prints "setting bar to [Object]"
//Notice that notify() worked even though 'foo' and 'bar' weren't even defined yet!

编辑:
似乎此功能称为“动态代理”,应出现在ECMAScript“和谐”标准中(可能是ES6)。您可以在这里阅读更多内容。引入了带有两个方法的新“代理”对象(即Create()和createFunction())。

一个可以做到这一点:

//Constructing an object proxy (proto is optional)
var proxy = Proxy.create(handler, proto);
proxy.foo = 2; //Triggers 'set' function in the handler (read about it)

底线:在大多数浏览器中都不起作用,但是可用于Node.js的实现:node-
proxy。


问题答案:

通过查看nowjs源代码,我相信他们可以通过持续监视now对象并在检测到它们时在客户端和服务器之间推送更改来做到这一点。我承认我还没有完全理解他们的代码。

在浏览器中,这可以通过一些有趣的setInterval技巧来完成。

编辑
:是的,这的确是他们的工作:客户的368行now.js。他们还会做一些技巧,以便一旦检测到新属性,getter和setter就会捕获对它的将来访问,但是这些修改仅在a中每1000毫秒进行一次setTimeout

另一个证据表明,在当前的JavaScript中这是不可能的,这是ECMAScript
Harmony的代理建议明确设计为支持此类方案,这非常有力地暗示它们目前无法完成。如果可能的话,最新的Mozilla浏览器具有代理实现的原型。显然,V8正在努力添加支持,这可能已经足够了,这取决于最近使用的V8
Node版本。

EDIT2 :哦,很酷,在 服务器
端,nowjs确实使用代理!这很可能意味着它们在Node中已经足够成熟,可以使用。在https://github.com/Flotype/now/blob/master/lib/proxy.js上查看他们的工作。或者只是var Proxy = require("nodejs-proxy")希望他们遵循规范,以便您可以利用MDC和其他地方的文档。



 类似资料:
  • 问题内容: 长话短说:我需要使用PHP风格的getter,但要使用JavaScript。 我的JavaScript仅在Firefox中运行,因此我可以使用Mozilla特定的JS。 我能找到的制作JS吸气剂的唯一方法是指定其名称,但我想为所有可能的名称定义一个吸气剂。我不确定这是否可行,但我非常想知道。 问题答案: 可以做到!我很高兴这个存在!这里给出一个答案:是否有与python的__getat

  • 本文向大家介绍JavaScript变量Dom对象的所有属性,包括了JavaScript变量Dom对象的所有属性的使用技巧和注意事项,需要的朋友参考一下 DOM对象的HTML:   <button>Disable State</buttom> 1,遍历DOM对象所具有的属性(全部,不管是否在HTML tag中是否设置) 结果: 2.遍历DOM对象在HTML中设置过的属性:   每一个attribut

  • 我声明了以下类,并声明了作为一个属性,该属性使用属性初始化decorators.however没有列出作为对象的属性,而是列出。这是如何工作的?

  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 问题内容: 如何遍历对象的所有属性?现在,我必须编写新的代码行以打印对象的每个属性 我可以使用foreach循环或任何循环遍历对象的所有属性吗? 像这样 问题答案: 如果这仅用于调试输出,则可以使用以下内容查看所有类型和值。 如果要对输出进行更多控制,可以使用以下命令:

  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用: