在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/