如果Javascript对象的某个属性包含对函数的引用,那么我可以从函数内部获取该属性名称吗?

卡尔保

所以:

var obj = {
  'key': function() {
    // get 'key' here
  }
};
obj.key();

例子:

http://plnkr.co/edit/tsUz6WY1qIvuoie3qSUv?p=preview

var logger = {
  'warn': function(msg) {
    var logLvl = 'warn'; // <-- want to get the string 'warn' right here

    console.log('[', logLvl, ']', msg);
  }
};
logger.warn('Computer is exploding.'); // => [ warn ] Computer is exploding. 

我只能想到使用命名函数并按函数this搜索的复杂方法

http://plnkr.co/edit/IHu087timHZCA2EbjDUa?p=preview

var logger = {
  'warn': function func(msg) {
    console.log('[', _.invert(this)[func], ']', msg);
  }
};
logger.warn('Computer is exploding.');

是否有捷径可寻?


更新:所以这里有更多关于我为什么问的细节。

这是一个Angular应用程序。这是预设列表。预设有一个名称和两个数字:https : //github.com/Wideshanks/breatherBar/blob/rmUI/app.js#L372

这些在前端显示为列表项:https : //github.com/Wideshanks/breatherBar/blob/rmUI/index.html#L42

当有人单击列表项时,我想向列表添加一个新的默认模式,并将名称/两个数字设置为预设中的名称。

预设是添加新样式的功能。这两个数字是在函数体内定义的,但预设的名称在函数外部:这是$ scope.presets中的属性名称:https : //github.com/Wideshanks/breatherBar/blob/rmUI/app.js #L359

大概只需要重新考虑整个事情,因为我的工作方式最终变得令人费解。

尖尖的

您可以装配如下所示的内容:

var logLevels = [ "trace", "debug", "info", "warn", "error" ];

var logger = logLevels.reduce(function(logger, level) {
  logger[level] = function(msg) {
    console.log("[" + level + "] " + msg);
  };
  return logger;
}, {});

这遍历了(当然是虚构的)日志级别列表,为每个级别添加了一个功能。该函数依赖于围绕.reduce()回调创建的闭包每个函数的行为均取决于logger与其关联属性,但并不是本质上以这种方式绑定在一起。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档