【问题标题】:Is it possible to automatically invoke a function call during property access in Javascript/Coffeescript?是否可以在 Javascript/Coffeescript 中的属性访问期间自动调用函数调用?
【发布时间】:2012-05-02 20:06:22
【问题描述】:

例如,这是我的“Hello”机器:

hello_machine = new HelloMachine;

此时,如果有人尝试访问 hello_machine 中的属性,我希望发生以下情况。

hello_machine.fred;
hello_machine.greetings(); // output: Hi, fred!

hello_machine.george;
hello_machine.greetings(); // output: Hi, george!

我希望这种情况自动发生,无论他们尝试访问的属性是什么。 我不想要任何硬编码

这是我想要调用的函数:

function set_buddy(name) {
  buddy = name;
}

问候语如下:

function greetings() {
  alert('Hi, ' + buddy);
}

显而易见的解决方案是不要这样做。这是一种糟糕的做法,它改变了 Javascript 的基本行为方式。但是,我处于这种行为非常棒的位置。

我的直觉告诉我这是不可能的,互联网也无法说服我相信这个事实(我的脑袋告诉我,我问这个问题是个傻瓜)。但我知道 Javascript 是一个善变的情妇,如果这个功能存在,我也不会感到惊讶。因此,如果有人知道我可以实施任何黑客攻击来获得这种行为,我一定会很感激。

【问题讨论】:

  • 你想要属性;设置者和获取者。我知道的唯一方法是使用代理。

标签: javascript coffeescript


【解决方案1】:

遗憾的是,如果没有代理,您将无法做到这一点:http://soft.vub.ac.be/~tvcutsem/proxies/

目前还没有得到广泛支持。甚至没有关闭。

如果您希望调用的属性事先已知,您可以使用更广泛支持的Object.define_property 声明getter 方法。但是在不知道要提前调用的属性的情况下,没有代理就无法拦截它们。

【讨论】:

  • 谢谢。我非常担心上面会是一个愚蠢的问题,但我很高兴看到我不是唯一一个看到这个价值的疯子。 :)
  • 然而,我确实觉得有必要补充一点,高质量的 JS 代码永远不应该通过访问属性而改变任何状态。它只是感觉不对,并且不符合最小意外的原则。应使用 Getter 方法返回计算值,但实际上不会更改任何状态。如果您想在 setter 方法 foo.bar = 123 中运行状态更改代码,那很好,因为您正在显式设置状态。我很难相信你的方法能带来任何好处。
  • 我正在尝试制作一种程序模板语言。我觉得这种方法在非常狭窄的范围内是有意义的。这将是其中之一。例如,my_object.table.tr.td.export() 将输出 <table><tr><td>。让它们动态化可以让我在保持流畅的语法结构的同时使其更加紧凑。就目前而言,我要么必须执行my_object.tag('table').tag('tr').tag('td') 之类的操作,要么必须在每个函数中进行硬编码,例如my_object.table().tr().td()。为了可用性,我倾向于第二个。几千字节到底是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多