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;

ゲッターに「oh.cool」または「oh.neat」の部分が必要なので、これに基づいて決定を下し、それに固有のものを返すことができます。主にノード用であるため、ソリューションがIEまたは古いブラウザーで機能しないことは問題ありません。

これの実際の目的はmyThing.gen.oh.neat、myThing.gen ゲッターをリクエストして、解決しrequire('./oh/neat.js')て返すことができるようにすることです。

キャッシュが必要であるため、これはモジュラー機能を動的にロードし、事前に構造を知らなくても (必要に応じて動的に 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 に答える