2011-11-04 8 views
1

は、次のように私はカスタムオブジェクト/ javascriptの「クラス」(エアクオート)を作成するとします。カスタムオブジェクトをjavascriptのオブジェクトのプロパティとして使用できますか?

// Constructor 
function CustomObject(stringParam) { 
    var privateProperty = stringParam; 

    // Accessor 
    this.privilegedGetMethod = function() { 
    return privateProperty; 
    } 

    // Mutator 
    this.privilegedSetMethod = function(newStringParam) { 
    privateProperty = newStringParam; 
    } 
} 

その後、私は、私は簡単にそのリストから物事を追加または削除することができ、これらのカスタムオブジェクトのリストを作りたいです。私は、カスタムオブジェクトのリストを格納するための方法として、オブジェクトを使用することにしたので、私は

var customObjectInstance1 = new CustomObject('someString'); 
var customObjectInstance2 = new CustomObject('someOtherString'); 
var customObjectInstance3 = new CustomObject('yetAnotherString'); 

myListOfCustomObjects[customObjectInstance1] = true; 
myListOfCustomObjects[customObjectInstance2] = true; 
myListOfCustomObjects[customObjectInstance3] = true; 

でリストにカスタムオブジェクトを追加し、

delete myListOfCustomObjects[customObjectInstance1]; 

で、リストからカスタムオブジェクトを削除することができますが、もし私は「i.privilegedGetMethodは()関数ではありません」と言うFirebugのコンソールでエラーになるだろう

for (i in myListOfCustomObjects) { 
    alert(i.privilegedGetMethod()); 
} 

でリストを反復してみてください。この問題やjavascriptのイディオムを修正する方法はありますか?申し訳ありませんが、これはばかな質問ですが、私はjavascriptには新しく、役に立たないと私の問題への解決策のためにインターネットを精査しています。どんな助けもありがとう!

P.S.私の例は非常に単純化されており、private.propertyなどを使ってprivatePropertyをパブリックにすることはできますが、それでもアラートでは未定義になり、カプセル化しておきたいと思います。

+0

私はここで何を達成しようとしているのかはよく分かりませんが、構文エラーがあるので、あなたのコードは動作してはいけません。具体的には、コンストラクタを '()'の代わりに '[]'で呼び出す方法です。 – ZenMaster

+0

申し訳ありませんが、それはタイプミスでした。私は括弧を固定 – user1030342

+0

私はカスタムオブジェクトのリストを作成し、それらの特権メソッドへのアクセスを維持しながらそれらを反復する方法を探しています。 – user1030342

答えて

1

iは元のオブジェクトではありません。

for (i in myListOfCustomObjects) { 
    alert(typeof i); // "string" 
} 

JavaScriptですべてのキーが文字列であるため、これがあります。別のタイプをキーとして使用しようとすると、まずtoString()によってシリアル化されます。 toString()の結果は、インスタンスごとに何らかの形で一意でない場合

、それらはすべて同じキーになります。

function MyClass() { } 
var obj = {}; 

var k1 = new MyClass(); 
var k2 = new MyClass(); 

obj[k1] = {}; 
obj[k2] = {}; 

// only 1 "[object Object]" key was created, not 2 object keys 
for (var key in obj) { 
    alert(key); 
} 

は、それらを一意にするために、カスタムtoString定義:

function CustomObject(stringParam) { 
    /* snip */ 

    this.toString = function() { 
     return 'CustomObject ' + stringParam; 
    }; 
} 

var obj = {}; 
var k1 = new CustomObject('key1'); 
var k2 = new CustomObject('key2'); 

obj[k1] = {}; 
obj[k2] = {}; 

// "CustomObject key1" then "CustomObject key2" 
for (var key in obj) { 
    alert(key); 
} 

を[編集]

カスタムtoStringでは、オブジェクトをシリアル化されたキーとして設定し、それらを整理してstilにすることができますlはそれらへのアクセスを継続:

var customObjectInstance1 = new CustomObject('someString'); 
var customObjectInstance2 = new CustomObject('someOtherString'); 
var customObjectInstance3 = new CustomObject('yetAnotherString'); 

myListOfCustomObjects[customObjectInstance1] = customObjectInstance1; 
myListOfCustomObjects[customObjectInstance2] = customObjectInstance2; 
myListOfCustomObjects[customObjectInstance3] = customObjectInstance3; 

for (i in myListOfCustomObjects) { 
    alert(myListOfCustomObjects[i].privilegedGetMethod()); 
} 
+0

ああ、それは私が疑問に思っていたものです。彼らはすべて文字列に変換されますか?カスタムオブジェクトのリストを作成し、特権メソッドにアクセスしてそれらを反復する最良の方法は何ですか? – user1030342

+0

@ user1030342「真」ではなく値として設定することで、それらを一意のシリアライゼーションに関連付けることができます。私の編集例を見てください。 –

+0

ok、今私は奇妙なエラーが発生しています。私がただ1つの特権メソッドを実行すれば、それは素晴らしいです!しかし、私は複数の場合、最初の特権メソッドは正常に動作しますが、残りの "myListOfCustomObjects [i]は未定義です"エラーを取得します。私は注文を交換し、最初のものは常に正常に動作しますが、残りはそのエラーを受け取ります。私は何かをもう一度見逃している? – user1030342

1

for iteration変数は、オブジェクト自体ではなくインデックスにすぎません。

for (i in myListOfCustomObjects) { 
    alert(myListOfCustomObjects[i].privilegedGetMethod()); 
} 

と、あなたは配列のインデックス/ハッシュとしてオブジェクトを使用している場合は、私の意見では、それだけで単一のエントリをリストで終わる文字列「オブジェクト」に変換されます:だから使いますすべてのキーが同じであるためです(「オブジェクト」)。あなたが期待していたとして

+0

単に間違っています。配列へのインデックスとして渡されるオブジェクトは、文字列 'Object'に変換されず、1つの要素を持つリストを作成しません。ただし、配列オブジェクトには[オブジェクトオブジェクト]というプロパティが作成されます。 – ZenMaster

+0

右の値ではなく、インデックスを反復処理しませんか?各キーと値のペアの値は真です。私は私のリストオブジェクトが{CustomObject1:true、CustomObject2:true}のようなものを見ていると仮定しています – user1030342

1
myListOfCustomObjects =[ 
      new CustomObject('someString'), 
      new CustomObject('someOtherString'), 
      new CustomObject('yetAnotherString') 
] 

あなたは、配列のインデックスで任意の要素へのアクセスを取得します。

+0

もし私が最終的に配列を使う必要があるなら、リストからオブジェクトを削除する最良の方法は何ですか?もしリストからCustomObject( 'yetAnotherString')を削除したいのであれば、それを削除する最良の方法は何ですか? – user1030342

関連する問題