Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript/Coffeescript中的属性访问期间,是否可以自动调用函数调用?_Javascript_Coffeescript - Fatal编程技术网

在Javascript/Coffeescript中的属性访问期间,是否可以自动调用函数调用?

在Javascript/Coffeescript中的属性访问期间,是否可以自动调用函数调用?,javascript,coffeescript,Javascript,Coffeescript,例如,这是我的“Hello”机器: 此时,如果有人试图访问hello\u machine中的属性,我希望发生以下情况 hello_machine.fred; hello_machine.greetings(); // output: Hi, fred! hello_machine.george; hello_machine.greetings(); // output: Hi, george! 我希望这种情况自动发生,而不管他们试图访问哪个属性。我不想要任何硬编码的东西 这是我想调用的函数:

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

此时,如果有人试图访问
hello\u 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是一个变化无常的情妇,如果这个功能存在的话,我也不会感到惊讶。因此,如果有人知道我可以实施任何黑客来获得这种行为,我一定会非常感激。

遗憾的是,没有代理,您无法做到这一点:

这一点还没有得到广泛的支持。甚至不接近


如果您希望调用的属性是已知的,那么您可以使用
Object.define\u property
声明getter方法,这是一种更广泛支持的方法。但是如果事先不知道要调用的属性,没有代理就无法拦截它们。

您需要属性;二传手和接球手。我知道的唯一方法就是使用代理。谢谢。我非常担心上述问题会是一个愚蠢的问题,但我很高兴地看到,我不是唯一一个看到这一点价值的疯子。:)然而,我觉得有必要补充一点,高质量的JS代码不应该改变访问属性的任何状态。它只是感觉不对,而且不符合最不意外的原则。应该使用Getter方法返回计算值,但实际上不改变任何状态。如果您想在setter方法中运行状态更改代码
foo.bar=123
,这很好,因为您正在显式地设置状态。我很难相信你的方法能带来任何好处。我正在尝试制作一种过程模板语言。我觉得这种方法在非常狭窄的范围内是有意义的。这将是其中之一。例如,
my_object.table.tr.td.export()
将输出
。让它们动态可以让我在保持流畅的语法结构的同时使它更加紧凑。目前,我要么在每个函数中执行类似于
my_object.tag('table').tag('tr').tag('td')
的操作,要么执行类似于
my_object.table().tr().td()的硬代码。出于可用性的考虑,我倾向于第二种。几KB到底是多少?
function greetings() {
  alert('Hi, ' + buddy);
}