对象/哈希中的Javascript函数

4
我可以直接调用一个函数(以alert为例),如下所示:
alert("Hello World!");  // pops up an alert window

然而,当我将一个函数放入对象中时,调用它就不再起作用了:
d = {func: alert};
d.func("Hello World!");    // doesn't do anything
d["func"]("Hello World!"); // also doesn't do anything

我想也许需要明确传递一个空的this参数,所以我尝试了以下代码:

d.func(null, "Hello World!") // still nothing

但是没有用。有趣的是,这确实起作用。

d.func.apply(null, ["Hello World!"]);  // success!

但这种写法过于冗长,让我感到非常难受(引用 JWZ 的话)。有没有更简洁、更美观的写法呢?

3个回答

4
JavaScript中的函数按值传递。 alert() 函数是本地实现的,这意味着它没有JavaScript值。根据您的浏览器,该本地包装器的可读性(请原谅我)会有所不同。您的代码实际上可以在Google Chrome中工作,但在Firefox中不起作用,而且我想说,它在通常不友好于修改本机对象和函数的Internet Explorer中也不起作用。您可以改用以下内容代替:
d = {
    func: function (message) {
        alert(message);
    }
};

啊,你似乎是正确的。检查警报告诉我它没有所有常规Javascript对象具有的属性,因为它是“内置的”,正如你所说的那样。感谢在Chrome中进行测试并解释行为。 - Eli Courtwright
1
我有一个修改要提出——它在Chrome中并不总是有效。代码与您编写的完全相同,会导致非法调用错误。但是,如果您只是在全局命名空间中引用警报,即:var myAlert = alert; myAlert("Hello, World!"); // Works!这对我来说看起来像是棘手的浏览器行为。 - Andrew Noyes

3
如果你尝试这样做:
function test(x) {
    alert(x);
}
var x = {func: test}
x.func('Hi!');

它的工作方式与您期望的相同。当我尝试直接对alert执行此操作时,Firebug会给出以下错误消息:

[Exception... "Cannot modify properties of a WrappedNative"
nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)"
location: "JS frame :: https://dev59.com/o0fRa4cB1Zd3GeqP-JJ9 :: anonymous :: line 72" data: no]

所以我猜测这是一个安全问题或与它作为本地功能有关。


有趣 - 我在Firebug中没有收到那个消息,所以我猜我的版本的行为不同。我猜这个问题只是限于警报功能,用户定义的函数工作得很好。然而,我无法找出任何原因导致这种行为 - 我们没有以任何方式修改警报,所以我无法确定为什么会有害。 - Eli Courtwright

1

我一直都是这样做的:

var d = Object;

d.hello = function(msg) {
                    alert(msg)
                    };

d.hello('hello');

当然,你也可以使用PrototypeJS来获取所有面向对象的内容:

var Message = Class.create( {
              display:  function(msg) {
                  alert(msg);
               }
           });

var msg = new Message();

msg.display('hello');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接