给定一个像这样的 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')
并返回它。
由于 require 缓存,这是一种动态加载模块化功能的有效方式,并且具有整洁的界面(而不仅仅是在需要的地方动态构建 require),而无需提前知道结构。
如果没有自省函数可以为我得到这个,我可以做一些不那么优雅的事情,像这样:
myThing.gen = function(name){
return require('./' + name.replace('.', '/') + '.js');
}
并这样做:
neatThing = myThing.gen('oh.neat');
不过,我不太喜欢这种语法。我查看了 chai 的动态 expect(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')
}
};
}
});
有没有办法动态地做到这一点?