2

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

有没有办法动态地做到这一点?

4

1 回答 1

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/

于 2013-08-24T18:21:05.980 回答