给出像这样的javascript对象:
var myThing = {};
Object.defineProperty(myThing, 'gen', {
'get' : function() {
// access caller name here, so I can return cool/neat stuff
}
});
我希望能够得到myThing.gen的孩子,但是知道getter中要求的是什么。
例如:
var coolThing = myThing.gen.oh.cool;
var neatThing = myThing.gen.oh.neat;
我想在getter中使用“oh.cool”或“oh.neat”部分,因此我可以根据此做出决定,并返回特定的内容。我没有在IE或旧浏览器中工作的解决方案,因为它主要用于节点。
这样做的目的是让我可以请求myThing.gen.oh.neat
并让myThing.gen getter解析为require('./oh/neat.js')
并将其返回。
由于需要缓存,这是一种动态加载模块化功能的有效方式,并且具有整洁的界面(而不仅仅是在需要时动态构建需求),而无需提前知道结构。
如果没有内省名称功能可以为我解决这个问题,我可以做一些不太优雅的事情,比如:
myThing.gen = function(name){
return require('./' + name.replace('.', '/') + '.js');
}
并执行此操作:
neatThing = myThing.gen('oh.neat');
尽管如此,我并不喜欢这种语法。我查看了chai的动态期望(var).to.not.be.empty的东西,但无法弄清楚如何完全动态地完成它。也许没有办法。
没有真正解决动态发现调用者的问题,我可以这样做:
var myThing = {};
Object.defineProperty(myThing, 'gen', {
'get' : function() {
return {
'oh':{
'cool': require('./oh/cool.js'),
'neat': require('./oh/neat.js')
}
};
}
});
有没有办法动态地执行此操作?
答案 0 :(得分:0)
您无法看到将来将使用属性gen
,因此您需要返回一个对象,该对象具有对实际发生时对象所用内容做出反应的属性:
var myThing = {};
Object.defineProperty(myThing, 'gen', {
'get' : function() {
var no = {};
Object.defineProperty(no, 'cool', {
get: function(){ alert('cool'); }
});
Object.defineProperty(no, 'neat', {
get: function(){ alert('neat'); }
});
return { oh: no };
}
});