簡體   English   中英

如果Javascript對象具有保存對函數的引用的屬性,是否可以從函數本身中獲取該屬性名稱?

[英]If a Javascript object has a property which holds a reference to a function, can I get that property name from within the function itself?

所以:

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屬性運行,但它本身並不是這樣綁定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM