向JavaScript对象添加元数据

3

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

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

如何实现addMetadata和getMetadata方法?

1
对于对象,可以。但对于字符串、数字和布尔值,不行。我猜你总是可以创建自己的映射结构,但除非有什么原因,否则我不会将其称为“元数据” :-) - Pointy
1
JavaScript 中的函数是对象,所以是的。 - Pointy
2个回答

3

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

然而,我无法想象将元数据附加到字符串/数字文字常量会有何用处。


我不知道你可以将函数用作对象,所以这就是解决方案。 - MaiaVictor
顺便提一下,你无法通过这种方法区分 1"1" 或者 true"true"。这实际上是属性名称的限制(所有内容都被转换为字符串)。 - Felix Kling
此外,您无法区分实际上是不同事物的相同字符串。例如,两个文本可能包含相同的短语,但您可能希望标记它们指向各自的文章。 - MaiaVictor
@Dokkat:在这种情况下,这些“文本”应该是实际的对象,而不仅仅是字面上的字符串。 - georg
1
@FelixKling:是的,一个更现实的解决方案应该使用嵌套的字典和类似 storage[typeof x][x]=data 的东西,但我仍然不明白在原始数据类型上附加数据的任何意义。 - georg
显示剩余2条评论

0
你可以这样做:
var metaDataStorer = {};
function addMetadata(object, meta) {
    metaDataStorer[object] = meta;
}
function getMetadata(object) {
    return metaDataStorer[object];
}

对象属性必须具有字符串值的属性名称(属性可以是任何内容,但名称必须是字符串,换句话说)。 - Pointy
Libert,尝试创建多个对象并使用console.log输出你的metaDataStorer。 - MaiaVictor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接