さまざまな変数のアドレスを配列に格納できるようにしたいと思います。これにより、名前で変数にアクセスしたり、必要に応じて変数を反復処理したりできます。これはJSで可能ですか?
(function(ns){
ns.obj = new function(){
var foo = "foo";
var bar = "bar";
//i really want this:
//var ary = [&foo, &bar];
var ary = [foo, bar];
this.print = function() {
console.log( foo );
console.log( bar );
}
this.setFoo = function( newFoo ) {
//i really want this:
//*(ary[0]) = newFoo;
ary[0] = newFoo;
}
this.printAry = function() {
for( var i=0; i < ary.length; ++i ) {
console.log( ary[i] );
}
}
};
}(window.ns = window.ns || {}) );
ns.obj.print();
ns.obj.setFoo("newfoo!");
ns.obj.printAry();
ns.obj.print();
私はこれを見ました:
しかし、割り当てのLHSでの要素を使用できるようにしたいとary
思います。この状況では、この例は機能しないと思います。
なぜ私はこれをしたいのですか?
これまでのところ、多くのコメントが(当然のことながら)私がこれをやりたい理由を尋ねてきました。非同期オブジェクト初期化メカニズムを含む独自のAPIを扱っています。基本的に、オブジェクトのインスタンスを作成し、それをこの初期化子に渡して、実際に使用できるようにします。イニシャライザには、初期化が成功したことを通知するonSuccessハンドラのフィールドが含まれています。完全に初期化されたオブジェクトは、引数としてこの成功ハンドラーに渡されるため、オブジェクトへの参照を取得できます。
その後、次のオブジェクトを自由に初期化できます。それはちょっとこのように見えます:
var a = new api.ApiObject();
var b = new api.ApiObject();
var c = new api.ApiObject();
var d = new api.ApiObject();
//omg this is ugly
api.initializeObject( {
objToInit: a,
onSuccess: function(args) {
a = args.obj;
api.initializeObject( {
objToInit: b,
onSuccess: function(args) {
b = args.obj;
api.initializeObject( {
objToInit: c,
onSuccess: function(args) {
c = args.obj;
api.initializeObject( {
objToInit: d,
onSuccess: function(args) {
d = args.obj;
}
} );
}
} );
}
} );
}
} );
a.doCoolStuff();
//and so on
この深くネストされた混乱は、私がさらに追加するにつれて悪化しますapi.ApiObjects()
。では、これを修正するにはどうすればよいですか?APIを変更することはできませんが、再帰関数が役立つ可能性があります。
//maybe a recursive function could make this more concise?
function doInitialize( ary ) {
api.initializeObject( {
objToInit: ary[0];
onSuccess: function(args) {
//i'd like to assign this passed in reference to my local
//reference outside this function (var a, b, etc).
//An array of pointers would be useful here.
//how else can I get this assigned out, cuz this doesn't work...
ary[0] = args.obj;
if( ary.length > 1 ) {
ary.splice( 0, 1 );
doInitialize( ary );
}
}
}
}
doInitialize( [a,b,c,d] );
//this won't work because I don't have a reference to the fully initialized object
a.doCoolStuff();
したがって、おそらくより良い質問は、このような非同期の成功連鎖を処理するための確立されたパターンがありますか?他のパブリックJSフレームワーク(dojoなど)がこの種のonSuccessチェーンを使用しているのを見たことがあると思います...これを醜くしないようにするにはどうすればよいですか?