向JavaScript对象添加元数据

向JavaScript对象添加元数据,javascript,metadata,metaprogramming,Javascript,Metadata,Metaprogramming,是否可以向JavaScript对象(包括字符串、数字和函数)添加元数据?就是 double = function(a){ return a*2; }; addMetadata(double,{desc:"Returns the double of a number."}); getMetadata(double).desc; 如何实现addMetadata和getMetadata?您可以这样做: var metaDataStorer = {}; function addMetadata(obj

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

double = function(a){ return a*2; };
addMetadata(double,{desc:"Returns the double of a number."});
getMetadata(double).desc;
如何实现addMetadata和getMetadata?

您可以这样做:

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

对于对象(包括函数),实现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))

然而,我无法想象将元数据附加到字符串/数字文本会有什么用处

对于对象,是的。对于字符串、数字和布尔值,没有。我想你可以创建自己的映射结构,但我不会称之为“元数据”,除非出于某种原因我真的想:-)函数是JavaScript中的对象,所以是的。对象属性必须有字符串值的属性名称(属性值可以是任何内容,但名称必须是字符串,换句话说).Libert,尝试创建多个对象和控制台。记录您的元数据存储。我不知道您可以将函数用作对象,所以这就是解决方案。@Dokkat:除了基本值之外,所有东西都是对象。顺便说一句,仅供参考,您将无法区分
1
“1”
true
“true”
使用此方法。这实际上是对属性名称的限制(所有内容都转换为字符串)。此外,您无法区分实际上是不同事物的相同字符串。例如,两个文本可能包含相同的短语,但您可能希望标记它们指向各自的文章。@FelixKling:是的,更现实的解决方案应该使用嵌套的dict和类似
storage[typeof x][x]的内容=data
,但我同样看不到将数据附加到原语中的任何意义。