• ベストアンサー

JavaScriptでArrayオブジェクトもどきの独自オブジェクトを作りたい!

susie-tの回答

  • ベストアンサー
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.3

> メソッドやプロパティは独自のものを使いますので、Arrayオブジェクトのメソッドやプロパティは継承しなくてもかまいません。 ということであれば、以下でどうでしょう? ----------------------------------------------------- <html> <head> <title></title> <script> var PseudoArray = function (param1, param2) { this.prop1 = param1; this.prop2 = param2; var ary = ["a", "b", "c"]; for(var i = 0; i < ary.length; i++){ this[i] = ary[i]; } }; PseudoArray.prototype = { prop1 : null, prop2 : null, method1 : function(a, b){ return (a + b + this.prop1); }, method2 : function(a, b){ return (a + b + this.prop2); } }; var pa = new PseudoArray(1, 2); var hoge1 = pa.method1(3, 4); var hoge2 = pa.method2(5, 6); var str = hoge1 + ", " + hoge2 + ", " + pa[2]; </script> </head> <body onload="document.getElementById('test').innerHTML = str;"> <div id="test"></div> </body> </html> ------------------------------------------------ 書き方はちょっと違いますが、仕組みはNo2で挙げた参考URLと一緒です。 自オブジェクトのメソッド・プロパティはthis経由で使えます。 参考になりますでしょうか。

egeek
質問者

お礼

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クラスのメソッド・プロパティを個別に指定してコピーすることになりますが・・・。」 と書かれたことだったのですね。 具体的にコードを書いてくださって、大変参考になりました。 本当にありがとうございました。 おかげさまをもちまして本件は解決したのですが、もうしばらく、質問を締め切らずに皆様のご助言を賜りたいと思いますので、ご了承願います。

関連するQ&A

  • JavaScriptでオブジェクトの配列

    function myfunc() {} で定義したようなオブジェクトを var arr = new Array(); arr.push()で配列に入れて、あとから取り出す際に arr[0]をmyfunc型として使うにはどうすればよいでしょうか? キャストのようなものも多分なさそうですし。

  • 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"; ---------------------------------------------------------------------

  • イベントに独自引数を渡したい。

    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の記載が長くなるので、 ここで質問した方法がわかれば何とか後は自分でできると思うのですが、 よろしくご教示お願いいたします。

  • どういうときにjQueryオブジェクトが返るのか

    jQueryの初心者なのですが、どういうときにjQueryオブジェクトが返るのかよくわかりません。 var sample = $(array) のように右辺がjQueryを使っていたら、左辺にもjQueryオブジェクトが入るのでしょうか?それとも、単純なdom要素が入るのでしょうか? 自分は、前者だと思っているのですが、サンプルコードを色々とみていると、 var sample = $(window); $(sample).each(function(){ }) などのように、$()でまた変数を囲っているものも見受けられます。 果たしてどうなのでしょうか? 以上、よろしくお願い致します。

  • 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の標準仕様で用意されているオブジェクトを拡張してもよいのかしら?  例えば、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で引数を参照渡しを行いたいのですが空で返ってきます。 どうすればよいのでしょうか? 参照渡しの引数がうまくいかない場合は戻り値を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 + ']');

  • ユーザー定義オブジェクト

    現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //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を使用している意図など) ご教授いただきたく、よろしくお願いします。