在javascript中获取调用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”部分,所以我可以根据这个做出决定,并且返回一些特定的东西。 我可以解决scheme不工作在IE,或旧的浏览器,因为它主要是节点。

这样做的实际目的是,我可以请求myThing.gen.oh.neat并让myThing.gen getterparsing为require('./oh/neat.js')并返回它。

由于需要caching,所以这是dynamic加载模块化function的有效方式,并且具有整洁的接口(而不是仅仅在需要的地方dynamic构build需求),而无需提前知道结构。

如果没有反省名称的function可以为我所用,我可以做一些不那么优雅的事情,比如:

 myThing.gen = function(name){ return require('./' + name.replace('.', '/') + '.js'); } 

并做到这一点:

 neatThing = myThing.gen('oh.neat'); 

虽然我不太喜欢这个语法。 我看着柴的dynamic期望(var),而不是空的东西,但不知道如何完全dynamic地做到这一点。 也许没有办法

没有真正解决dynamic发现调用者的问题,我可以这样做:

 var myThing = {}; Object.defineProperty(myThing, 'gen', { 'get' : function() { return { 'oh':{ 'cool': require('./oh/cool.js'), 'neat': require('./oh/neat.js') } }; } }); 

有没有办法做到这一点dynamic?

你将看不到属性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/