在javascript中获取getter的调用参数

时间:2013-08-24 18:07:50

标签: javascript node.js getter

给出像这样的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')
          }
       };
    }
});

有没有办法动态地执行此操作?

1 个答案:

答案 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 };
  }
});

演示:http://jsfiddle.net/UjpGZ/1/