【问题标题】:Add metadata to JavaScript objects将元数据添加到 JavaScript 对象
【发布时间】:2013-01-03 23:05:38
【问题描述】:

是否可以将元数据添加到 JavaScript 对象(包括字符串、数字和函数)?也就是说,

double = function(a){ return a*2; };
addMetadata(double,{desc:"Returns the double of a number."});
getMetadata(double).desc;

addMetadata 和 getMetadata 怎么实现?

【问题讨论】:

  • 对于对象,是的。对于字符串、数字和布尔值,没有。我猜你总是可以创建自己的地图结构,但除非出于某种原因我真的想这样做,否则我不会称之为“元数据”:-)
  • 函数是 JavaScript 中的对象,所以是的。

标签: javascript metadata metaprogramming


【解决方案1】:

对于对象,包括函数,实现get/setMetadata的最佳方式是根本不去实现。

double = function(a){ return a*2; };
double.desc = "Returns the double of a number."
alert(double.desc);

对于“原始”字符串/数字,您可以使用另一个答案中建议的字典方法:

metaStorage = {}

setMetaData = function(obj, data) {
    if(typeof obj == "object")
        obj._metaData = data;
    else
        metaStorage[obj] = data;
}

getMetaData = function(obj) {
    if(typeof obj == "object")
        return obj._metaData;
    else
        return metaStorage[obj];
}

setMetaData(1, "this is one");
console.log(getMetaData(1))


setMetaData(window, "my window");
console.log(getMetaData(window))

但是,我无法想象将元数据附加到字符串/数字文字会有多大用处。

【讨论】:

  • 我不知道您可以将函数用作对象,所以这就是解决方案。
  • @Dokkat:除了原始值之外,一切都是对象。
  • 顺便说一句,仅供参考,使用此方法您将无法区分 1"1"true"true"。这实际上是属性名称的限制(所有内容都转换为字符串)。
  • 此外,您无法区分实际上是不同事物的相同字符串。例如,两个文本可能包含相同的短语,但您可能希望将它们标记为指向各自的文章。
  • @FelixKling:是的,更现实的解决方案应该使用嵌套字典和storage[typeof x][x]=data 之类的东西,但同样,我看不到将数据附加到原语的任何意义。
【解决方案2】:

你可以这样做:

var metaDataStorer = {};
function addMetadata(object, meta) {
    metaDataStorer[object] = meta;
}
function getMetadata(object) {
    return metaDataStorer[object];
}

【讨论】:

  • 对象属性必须具有字符串值的属性名称(属性 values 可以是任何东西,但名称必须是字符串,换句话说)。
  • Libert,尝试制作多个对象并 console.log 你的 metaDataStorer。
猜你喜欢
  • 2020-04-05
  • 1970-01-01
  • 2010-12-17
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2020-10-22
相关资源
最近更新 更多