我正在设计一个小型库,并试图尽可能地保持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.
因此,我留下了函数对象的设置属性,这似乎很糟糕,因为我可能会覆盖函数的原始属性,例如:
applyprototype__proto__然而,JS世界中的许多东西都是hacky,我们很乐意每天都这样做.问题是:这是不安全的,会导致数千只小猫死亡吗?
缺点是,您必须事先知道您使用的是哪些密钥.
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)