我想将元数据的键值对添加到任意 JavaScript 对象。此元数据不应影响不知道元数据的代码,这意味着例如
JSON.stringify(obj) === JSON.stringify(obj.WithMetaData('key', 'value'))
元数据感知代码应该能够通过键检索数据,即
obj.WithMetaData('key', 'value').GetMetaData('key') === 'value'
有什么办法可以做到这一点 - 在node.js中吗?如果是这样,它是否适用于内置类型,例如String
甚至Number
罢工>? (Edit想一想,我不在乎真实的原语就像数字一样,但是有这个string实例会很好)。
一些背景:我想做的是缓存从对象本身派生的值,以便
- 对于不知道元数据的代码,元数据丰富的对象将看起来与没有元数据的原始对象相同
- 如果已经缓存,需要派生值的代码可以从元数据中获取它
- 缓存将与对象一起被垃圾收集
另一种方法是将哈希表与缓存一起存储在某处,但您永远不知道对象何时被垃圾收集。每个对象实例都必须手动处理,以便缓存不会泄漏。
(顺便说一句,Clojure 有这个功能:http://clojure.org/metadata 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 https://web.archive.org/web/20140209074803/http://www.mitya.co.uk/blog/2012/Feb/ECMAScript-revolution-object-properties-201
但是,您无法对字符串或数字等基本类型执行此操作,只能对复杂类型执行此操作。
[EDIT]
另一种方法可能是利用数据类型的原型来存储元。 (警告,提前破解)。所以对于字符串:
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'));
但这显然并不理想。一方面,如果字符串被收集或别名(因为简单数据类型是按值复制,而不是引用),您将丢失此元。老实说,只有第一种方法可以在现实环境中发挥作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)