有没有办法将元数据添加到JavaScript对象?

我想将元数据的键值对添加到任意 JavaScript对象.此元数据不应影响不了解元数据的代码,例如,这意味着
JSON.stringify(obj) === JSON.stringify(obj.WithMetaData('key','value'))

元数据识别代码应该能够通过密钥检索数据,即

obj.WithMetaData('key','value').GetMetaData('key') === 'value'

有没有办法做到这一点 – 在node.js?如果是这样,它是否适用于内置类型,如String和偶数? (编辑思考它,我不关心像数字这样的真实原语,但是对于字符串实例来说这很好).

一些背景:我要做的是缓存从具有对象本身的对象派生的值,以便这样做

>对元数据不了解代码,元数据丰富对象看起来与原始对象w / o Meta相同
>如果已经缓存,需要派生值的代码可以从元数据中获取
>缓存将在对象旁边收集垃圾

另一种方法是在某处存储带有缓存的哈希表,但是你永远不知道对象何时被垃圾收集.必须手动处理每个对象实例,以便缓存不会泄漏.

(btw clojure有这个功能http://clojure.org/metadata)

解决方法

您可以使用ECMA5的新对象属性API来存储对象中的属性,这些对象不会在枚举中显示但仍可检索.
var myObj = {};
myObj.real_property = 'hello';
Object.defineProperty(myObj,'Meta_property',{value: 'some Meta value'});
for (var i in myObj)
    alert(i+' = '+myObj[i]); //only one property - @real_property
alert(myObj.Meta_property); //"some Meta value"

更多信息:link

但是,您无法在原始类型(如字符串或数字)上执行此操作,只能在复杂类型上执行此操作.

[编辑]

另一种方法可能是利用数据类型的原型来存储元数据. (警告,黑客前进).所以对于字符串:

String.prototype.Meta = {};
String.prototype.addMeta = function(name,val) { this.Meta[name] = val; }
String.prototype.getMeta = function(name) { return this.Meta[name]; };
var str = 'some string value';
str.addMeta('Meta','val');
alert(str.getMeta('Meta'));

然而,这显然不是理想的.首先,如果字符串被收集或别名(因为简单数据类型是按值复制而不是引用),您将丢失此元数据.说实话,只有第一种方法在现实环境中有任何里程.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...