2009-06-27 5 views
1

私はおそらくコードを介してこれを説明するのが最もよいでしょう。難しいjavascriptの質問

var object1 = function(){ 
    //do something 
} 
var object2 = function(){ 
    //do something else 
} 

var objects = { 
    'o1' : object1, 
    'o2' : object2 
}; 

var actions = []; 

function addAction(actionName){ 
var object = objects[actionName]; 
actions.push(function(){ new object(); }); 
} 

ので、このコードは、配列に保存され、ユーザー入力に基づいて実行時に決定されたアクションのシーケンスを保存します。私はこのような何かを得ました。

addAction("o1"); 
addAction("o2"); 

私はちょうど行うことをシーケンス再生する場合:

for(i in actions){ 
    actions[i](); 
} 

をして、このタイプのオブジェクト1とオブジェクト2の2つの匿名オブジェクトを作成します。

今、私は何とかactions []配列をシリアル化する必要がありますが、スコープを保持するためにはその中の各関数が必要です。私は、文字列に関数をキャストした場合、私は得る:

"function(){ new object(); }" 

と、私はこの文字列をevalする場合は、「オブジェクト」は未定義になります。あなたはどうしますか?

答えて

1

私は、あなたがその機能にどの範囲を期待しているのかが少し不明です。

あなたが使用できるようにするだけ

actions.push(objects[actionName]); 

に機能をプッシュすると、あなたが望む効果を有することができる...

5

なぜ、オブジェクト内の関数と一緒にアクションの名前を保持していませんそのシリアル化:

function Action(name, func) { 
    this.name = name; 
    this.func = objects[name]; 
} 

function addAction(actionName) { 
    actions.push(new Action(actionName)); 
} 

多少変わってしまうの機能を実行するためのコード:

for (i in actions) actions[i].func(); 

あなたは単なる文字列で名前を置く配列シリアライズするには:あなたがあなたのをシリアル化したい場合は

var names = s.split(','); 
for (i in names) { 
    addAction(new Action(names[i])); 
} 
2

var s = ''; 
for (i in actions) { 
    s += (s.length == 0 ? '' : ',') + actions[i].name; 
} 

を次に、あなただけの名前からオブジェクトを再作成deserialiseすることを後で再生するアクションのリストを作成するには、アクションの名前を保存するだけのaddAction関数を変更する必要があります。

function addAction(actionName) 
{ 
    actions.push(actionName); 
} 

そして、あなたが再生する行くとき、あなたはアクションリストは単なる文字列であるので、あなたがシリアライズと何の問題もないはず

for(i in actions) 
{ 
    objects[actions[i]](); 
} 

を使用すると思います。