- ベストアンサー
JavaScriptでArrayオブジェクトもどきの独自オブジェクトを作りたい!
お世話になります。 JavaScriptを用いて、ある条件の下でArrayオブジェクトのような独自オブジェクトを定義したいのですが、ゆっくり調べている時間がなく、こちらの方を頼らせていただくことにしました。 【やりたいこと】 Arrayオブジェクトのような独自オブジェクトを定義したい。 【やりたいことの条件】 条件1: Arrayオブジェクトが戻り値として返ってくる既存の関数があり、その戻り値であるArrayオブジェクト自身を新たなオブジェクトとして定義したい。 この関数は、 ・Arrayオブジェクトの要素とは全く無関係の引数をとる。 ・この関数の仕様を変更することはできない。 という特徴があります。 条件2: 独自オブジェクトを作る際の引数は、上述の既存の関数の引数と同じ。 【サンプル】 上記の説明では、少々わかりにくいかもしれませんので、使い方のサンプルを以下に示します。 既存の関数: function immovableFunc(param1, param2) { var myArray = new Array; … return myArray; } 今回作りたいオブジェクト: PseudoArray 今回作りたいオブジェクトの使われ方: var pa = new PseudoArray(param1, param2); そもそも、このようなオブジェクトが作れるのか?、作れるとするならばどのように記述するのか?見当も付かない状態です。 皆さんのお知恵を拝借させていただければと思います。 どうぞ、よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
- susie-t
- ベストアンサー率86% (37/43)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
関連するQ&A
- JavaScriptでオブジェクトの配列
function myfunc() {} で定義したようなオブジェクトを var arr = new Array(); arr.push()で配列に入れて、あとから取り出す際に arr[0]をmyfunc型として使うにはどうすればよいでしょうか? キャストのようなものも多分なさそうですし。
- ベストアンサー
- JavaScript
- JavaScriptの連想配列について
myArray = new Array(); myArray["A001"] = new Array(); myArray["A001"]["B001"] = "B001"; myArray["A001"]["B002"] = new Array(); myArray["A001"]["B002"]["C001"] = "C001"; myArray["A001"]["B002"]["C002"] = "C002"; myArray["A002"] = "A002"; JavaScriptの連想配列について質問させて頂きます。 例えば上記のような配列があったとして、値とキーはそのままで "C001" と "C002" の"B002"配列への格納順序だけ入れ替えたい場合、 どのように実装すればよろしいでしょうか? ちなみにキーや値はサンプルで実際にはsort出来るルールはありません。。。 ※入れ替え後のイメージ --------------------------------------------------------------------- myArray = new Array(); myArray["A001"] = new Array(); myArray["A001"]["B001"] = "B001"; myArray["A001"]["B002"] = new Array(); myArray["A001"]["B002"]["C002"] = "C002"; ←格納順序が myArray["A001"]["B002"]["C001"] = "C001"; 入れ替わった myArray["A002"] = "A002"; ---------------------------------------------------------------------
- 締切済み
- JavaScript
- イベントに独自引数を渡したい。
ACTIONSCRIPT3.0で、外部ファイルを読み込ませる処理を行っているのですが、読み込み完了時の関数に独自の引数を渡すことは不可能なのでしょうか? var j:int = 100; var myArray:Array; for(var i=0;i<j;i++){ myArray[i] = new Loader(); myArray[i].load(new URLRequest(別の配列に入っている文字列のURL)) myArray[i].contentLoaderInfo.addEventListener(Event.INIT,myfunc); } function myfunc(e){イベント発生時の処理} のように、多数のイベント処理を書くときに配列のインデックスによって処理を分けたいのですが、上の例だとイベント発生時の関数であるmyfuncの引数は規定オブジェクトなので独自のものが渡せません。 いまは別にグローバルな配列を作成して処理をしているのですが、メモリ常駐になることや、オブジェクト指向として気に入らない状態です。 イベントが発生したオブジェクトの名前をキーにすることも考えましたが、どの道スマートではない。なにか方法はないものでしょうか? また、言語仕様的にやむをえないのでしょうか?
- ベストアンサー
- Flash
- 【ActionScript】大量引数の効率のよい受け渡し法は?
FLASH8(ActionScript2.0)使用者です。 ユーザー定義関数にて引数が大量にある場合、効率よく記述するにはどうすればいいのでしょうか。 現状配列で引数ひとつにまてめて処理しているのですが、関数内で展開する記述が非効率に思えます。 myArray["name"] = "taro"; myArray["age"] = 20; myArray["addr"] = "tokyo"; ・・・ function myFunc(myArray){ var name = myArray["name"]; var age = myArray["age"]; var addr = myArray["addr"]; ・・・ } この展開部分が数十に及ぶ場合、for文か何かで一発記述できればいいのに… と思うわけですがどうなんでしょうか。 「varなしにする」「配列のまま使う」 という方法もあると思いますが今回は除外させてください。 「無理」という回答でも結構です。 よろしくお願いいたします。
- ベストアンサー
- Flash
- 引数を変数で渡す方法
いつもお世話になります・。 function tst(a,b){ alert("a="+a+" b="+b) } として、 tst(1,'bbb'); とすれば a=1 b=bbb となります。 ところが、 Param="1,'bbbb'"; tst(Param); とすると、 a=1,bbb b=undefined となってしまいます。 また、 tst(eval(Param)); とすると、 a=bbb b=undefined と、なってしまいます。 また、 var Param=new array(1,'bbbb') tst(Param); とすると、何も表示されません。 引数 1,'bbb' を変数として関数に渡すにはどうしたらよいのでしょうか。 目的は、JSONで引数文字列を取得して関数に渡したいのです。 JSONで、関数に渡す引数をどのように定義したらよいものかと いうことでの質問です。 が、JSONの記載が長くなるので、 ここで質問した方法がわかれば何とか後は自分でできると思うのですが、 よろしくご教示お願いいたします。
- ベストアンサー
- JavaScript
- どういうときにjQueryオブジェクトが返るのか
jQueryの初心者なのですが、どういうときにjQueryオブジェクトが返るのかよくわかりません。 var sample = $(array) のように右辺がjQueryを使っていたら、左辺にもjQueryオブジェクトが入るのでしょうか?それとも、単純なdom要素が入るのでしょうか? 自分は、前者だと思っているのですが、サンプルコードを色々とみていると、 var sample = $(window); $(sample).each(function(){ }) などのように、$()でまた変数を囲っているものも見受けられます。 果たしてどうなのでしょうか? 以上、よろしくお願い致します。
- ベストアンサー
- JavaScript
- Arrayオブジェクトとforms配列
以下のスクリプトを実行すると、(2)の所で「document.forms.GetFromArray is not found」 のエラーとなります。(ブラウザはFirefox)。 意図としてはArrayオブジェクトをカスタマイズして追加したGetFromArray()メソッドでforms配列を操作したいのですが... エラーメッセージからすると、「document.formsは配列(Arrayオブジェクト)では無い」と言っているようです。 この方法でforms配列を参照する方法を教えて下さい。 あるいは、Arrayオブジェクトではない、他のオブジェクトをカスタマイズするのでしょうか?お願いします。 <html> <head> <script type="text/javascript"> <!-- Array.prototype.GetFromArray=function(func){ for(var i=0;i<this.length;i++){ func(this[i]); } } function disp1(h){ alert(h); } function disp2(h){ alert(h.name); } function run(){ var array=new Array('dog','cat','fish'); array.GetFromArray(disp1); //(1) OK document.forms.GetFromArray(disp2); //(2) エラー } //--> </script> </head> <body> <form name="test"> <input type="text" name="bunrui" value="分類">/ <input type="text" name="detail" value="詳細">/ <input type="button" value="実行" onClick="run();"> </form> </body> </html>
- ベストアンサー
- JavaScript
- javascriptの標準仕様で用意されているオブジェクトを拡張しても
javascriptの標準仕様で用意されているオブジェクトを拡張してもよいのかしら? 例えば、Arrayオブジェクトを拡張して降順ソートをやりたい時、 data=[1,2,3,4]; data.sort(function(a,b){return(b-a);}); alert(data); のように使うのは、仕様にあるので許されると思います。 Array.prototype.descending=function(){ this.sort(function(a,b){return(b-a);}); return this; } data=[1,2,3,4]; alert(data.descending()); のようにArrayオブジェクトを拡張して使って問題ないでしょうか? あるいは、 function myArray(arg){ this.descending=function(){ arg.sort(function(a,b){return(b-a);}); return arg; } } data=[1,2,3,4]; data=new myArray(data); alert(data.descending()); のように使うべきものなのでしょうか?
- ベストアンサー
- JavaScript
- Javascriptで引数の参照渡しか戻り値を複数取得したい
Javascriptで引数を参照渡しを行いたいのですが空で返ってきます。 どうすればよいのでしょうか? 参照渡しの引数がうまくいかない場合は戻り値を2つ返す方法と受け取る記述の仕方など知りたいです。 function test(indat, outdat, retval){ outdat = []; for (var i=0; i<indat.length; i++){ outdat[i] = indat[i]; } retval = 123; } var indat = new Array(); var outdat= new Array(); var retval = ""; indat[0] = 'A'; indat[1] = 'B'; indat[2] = 'C'; test(indat, outdat, retval); for (var i=0; i<outdat.length; i++){ alert(outdat[i]); } alert('retval=[' + retval + ']');
- ベストアンサー
- JavaScript
- ユーザー定義オブジェクト
現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目 function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。
- ベストアンサー
- JavaScript
お礼
susie-t様、再度のご回答ありがとうございます。 うまく動きました! ご回答いただいたコードを参考に、こちらの状況に合わせて下記のように書いてみました。 ----------------------------------- // テスト用スタブ // param1, param2 は無視されていますが、 // 実際は、配列の要素を決定するために使われます。 function immovableFunc(param1, param2) { var a = new Array; a[0] = 1; a[1] = "msg"; a[2] = false; return a; } function PAMethod1() { … } function PAMethod2() { … } … var PseudoArray = function(param1, param2) { var ary = immovableFunc(param1, param2); for ( var i=0; i<ary.length; i++ ) { this[i] = ary[i]; } this.prop1 = ary.length; … } PseudoArray.prototype = { prop1 : null, …, method1 : PAMethod1, method2 : PAMethod2, … } ----------------------------------- 先のご回答で 「どうしてもやるとすればArrayクラスのメソッド・プロパティを個別に指定してコピーすることになりますが・・・。」 と書かれたことだったのですね。 具体的にコードを書いてくださって、大変参考になりました。 本当にありがとうございました。 おかげさまをもちまして本件は解決したのですが、もうしばらく、質問を締め切らずに皆様のご助言を賜りたいと思いますので、ご了承願います。