2011-01-26 11 views
1

私はjQueryプラグインを開発しています。使用しているオブジェクトについていくつか質問があります。私は約1時間Googleを検索するのに費やしたことを約束しているが、私の検索用語はかなり具体的ではなかったようだ。ここでは例を示します。JavaScriptオブジェクト、2つの質問

var rgba = { 
    red = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 

    green = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 

    blue = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 
} 

は、今ではの 'startHex' 'のparseInt(startHex、16)' は未定義であることを私に教えてくれます。オブジェクト内の別の属性を兄弟属性から参照することは可能ですか?もしそうなら、それをどうやって行いますか?

私の他の質問は、 'rgba'の属性はすべて同じ属性を持っているからです。どのようにこれらを参照するためにforループを使って配列を使うことができますか?たとえば、これは動作しません。

var colors = ['red','green','blue']; 
for(i in colors) { 
    alert(rgba.colors[i].diffDec); 
} 

明白な理由のために、このコードは「RGBA」オブジェクトのための「色」と呼ばれる属性があるはずですので。 'RGBA' の属性ではありません)(

var colors = ['red','green','blue']; 
for(i in colors) { 
    alert(rgba.eval(colors[i]).diffDec); 
} 

しかし、それは私にそれはevalを伝えます:私はevalの()を使用して考えました。どのように私はこれを行うことができます(実際には 'rgba'の下に属性 '色'を作成する以外に)どのような提案?

ありがとうございます!あなたがここに二つの質問を求めている

+1

これを別々の2つの質問に分けてください。 – zzzzBov

答えて

1

実現する最初のポイントは、JavaScriptで範囲がより異なることです他のオブジェクト指向言語でも使用できます。 JSのスコープはオブジェクトに基づいているのではなく、関数に基づいています。だから、おそらく最善の策は、このように、色を作成する関数を作成することです:

var makeColor = function(startHexValue, endHexValue) { 
    var start = parseInt(startHexValue, 16); 
    var end = parseInt(endHexValue, 16); 
    return { 
    startHex: startHexValue, 
    startDec: start, 
    endHex: endHexValue, 
    endDec: end, 
    diffDec: start - end 
    }; 
}; 

(そしてもちろん、あなたが簡単にあなたが本当にしたい場合は、コンストラクタの中にそれを変更することができます。)次に、あなたのRGBAのオブジェクトは次のようになります。

var rgba = { 
    red : makeColor("FF", "0"), 
    green : makeColor("FF", "0"), 
    blue : makeColor("FF", "0") 
}; 

そして、あなたの最後の部分は次のようになります。

var colors = ['red','green','blue']; 
for(name in colors) { 
    alert(rgba[name].diffDec); 
} 

文字列はプロパティの名前、ない性質そのものです。

+1

(色の名前)は名前に値0,1,2,3を固定します。for ... in構造体は値ではなくラベルを提供します。 –

+1

ありがとう、私はこれが私が最初にやっていたよりもさらに多くのコードを節約すると思います! BTW 'rgba [colors [name]]。diffDec'はfor ... inループで動作します。 – Vinny

+0

ジョナサン:あなたはまったく正しい、考えていなかった。ちょうど入力し、テストしていない:)。 – jmbucknall

0

  1. 最初の質問—オブジェクト定数構文—約への答えは、初期化コードからオブジェクトの他の要素を参照することができないということです。つまり、オブジェクトは実際にはまだ存在しません。 1つの式で初期化してから、必要な追加プロパティを満たす関数を実行することができます。

  2. "eval()"のエラーは "rgba"の属性ではありませんが、 "rgba"の属性ではありません。あなたのコードのどこにでも "eval"という関数はありません。グローバルな「eval」関数はそれだけです。

最後に、あなたが言うループはうまくいきません。それが "for ... in"ループであるという事実以外に、私にそれに何か悪いことはないようです。 本当にがあなたがそれをしたいと思っているのでなければ、それらは実際に配列を反復するのに使われるべきではありません。

3

この方法で他のプロパティにアクセスすることはできません。あなたができることは次のとおりです。

function Color(startHex, endHex) { 
    this.startHex = startHex; 
    this.endHex = endHex; 
    this.startDec = parseInt(startHex,16); 
    this.endDec = parseInt(endHex,16); 
    this.diffDec = this.endDec - this.startDec; 
} 


var rgba = { 
    red : new Color('FF','00'), 
    green : new Color('FF','00'), 
    blue : new Color('FF','00') 
} 

2番目の部分については、不要な手順を追加しています。ただ、使用:

for(prop in rgba) { 
    alert(rgba[prop].diffDec); 
} 

はJavaScriptを使用して、これらの二つは等価であることに注意してください:

myobject.myproperty 

myobject["myproperty"] 
+1

いくつかの 'this'キーワードがないので、コンストラクタは正しくありません。特に 'this.endDec - this.startDec;':o) – user113716

+1

@patrick dw。かなり正しい。ありがとう。 –