2011-10-19 10 views
0

なぜこれがundefinedです:「属性」にアクセスするとき、Javascriptオブジェクトの値は未定義ですか?

var testObj = { 
    CONSTANT: "blah", 
    someVal: this.CONSTANT 
} 
console.debug(testObj.someVal); // prints "undefined" 

それは私が実際に新しいプロトタイプを作成していますので、thisキーワードが機能していないという事実に関係している場合、私はまた、次のことを知りたいのです: 、上記で

Test = Base.extend({ 
    testObj: { 
    someVal: this.CONSTANT 
    } 
    CONSTANT: "blah"; 
}); 
var test1 = new Test(); 
console.debug(test1.testObj); // someVal is undefined 

:私はベースを拡張するオブジェクトを持っている:私はディーンエドワードのbase.jsを使用していますが、私は上記と同様の何かをしようとしています

someVal: "blah"これを行うと、期待どおりに動作します。なぜ私がthis.CONSTANTにアクセスできないのか分かりません。そのthistestObjの範囲に適用されていて、Testでない場合は、どうすればこの問題を解決できますか(that: this変数を設定してみました。

アップデート:私はこれを間違っていると答えています。私の質問は今です:base.jsモデルを使用して、同じクラス(関数の外)内からアクセス可能な "クラスレベル"の定数を持つ方法はありますか?

答えて

5

thisは、オブジェクトではなくwindowです。

var CONSTANT = "blah"; 
var testObj = { 
    someVal: this.CONSTANT 
} 
testObj.someVal; // blah 

オブジェクト表記でオブジェクト自体にアクセスすることはできません。

function testObjCreator() { 
    this.CONSTANT = "blah"; 
    return ({ 
     val: this.CONSTANT 
    }) 
} 
var a = new testObjCreator() 
a.val; // blah 
+0

良い点:2番目のケースはどうですか(これは私が本当に関心を持っているものです)。 base.js(Animalクラスの例)を見ると、Deanは "this"を使用してオブジェクト自体にアクセスします。ありがとう。 – oym

+0

のbase.jsの例では、間違いなく私の範囲の問題のように思えます(「これは正しい範囲を参照していません」)。私はちょうどそれを修正する方法がわかりません。 – oym

+0

2番目の例では、これはまだウィンドウです – Joe

0

「これは」(ローカル)である唯一の方法として呼び出されている関数内で定義された:


あなた 関数は、この範囲を変更します。

base.jsは関数定義内でのみ "this"を使用します。ここでは、関数としてメソッドが呼び出されたオブジェクトを指定します。あなたの例には関数定義が含まれていません。

+0

良い点;私がやろうとしていることをする方法はありますか?基本的に同じクラス内でアクセスできるクラスレベルの定数を持っていますか? – oym

関連する問題