使用函数作为字典

bgu*_*ach 4 javascript

我正在设计一个小型库,并试图尽可能地保持API,使用函数作为字典/对象本身的想法看起来很吸引人.

这个想法是能够通常调用一个函数:

fn('hello', 'some other extra info to be processed', etc...)
Run Code Online (Sandbox Code Playgroud)

此调用将处理信息,然后将其存储在某处.可以在某些条件下访问此处理过的信息(不是典型的用例),以这种方式获取信息会很棒:

fn['hello']
//-> some stuff
Run Code Online (Sandbox Code Playgroud)

例如,在python中,[]运算符重载会非常容易,但是AFAIK在JS中没有一种简单可靠的方法可以在大多数环境中工作(代理似乎可以做到这一点,但我们还没有到目前为止).由于用户可以输入任何值,因此不能选择getter和setter.

因此,我留下了函数对象的设置属性,这似乎很糟糕,因为我可能会覆盖函数的原始属性,例如:

  • apply
  • prototype
  • __proto__

然而,JS世界中的许多东西都是hacky,我们很乐意每天都这样做.问题是:这是不安全的,会导致数千只小猫死亡吗?

Nin*_*olz 5

你可以使用settergetter函数.

缺点是,您必须事先知道您使用的是哪些密钥.

function fn(s) {
    if (!fn[s]) {
        Object.defineProperty(fn, s, { get: function () { document.write('hello '+s+'!<br>'); }, set: function () { } });
    }
    document.write('hello ' + s + '<br>');
}

fn('stackoverflow');
fn['stackoverflow'];
fn('42');
fn['42'];
fn['stackoverflow'];
Run Code Online (Sandbox Code Playgroud)