2012-01-12 4 views
4

Javascriptオブジェクトリテラルに問題があります。JavaScriptオブジェクトリファレンス

Iは、関数の1つにオブジェクトを参照したい:

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 

残念なことに、「ダム」機能は、同様の目的です。したがって、dumb()には の 'name'プロパティがないため、未定義として返されます。

どうすればこの問題を回避できますか?

+1

JSONリテラルJSオブジェクトのサブセットであるデータ形式であります構文。それはあなたが持っているものではありません(他の多くの機能の中では、機能をサポートしていません) – Quentin

+0

しかし、それは動作します:http://jsfiddle.net/damirR/aF63T/ – DamirR

+2

どうやって呼びますか? 'Obj.dumb()'は私のために 'Johnny'に警告します。 – Gumbo

答えて

8

dumbは、Objオブジェクトのメソッドです。呼び出されると、thisObjに設定され、 "ジョニー" を警告する

Try it out

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 

Obj.dumb(); 
6

あなたのコードは大丈夫です。 dumbへの呼び出しは次のようになります。JavaScriptで

Obj.dumb(); // "Johnny" 

this機能がと呼ばれる方法をによって完全に定義されている、いない関数が定義されます。オブジェクトプロパティを使用して関数を呼び出すと、thisという呼び出しでそのオブジェクトを参照します。あなたはこれをしなかったのであれば、たとえば、:

var f = Obj.dumb; 
f(); // "undefined" 

をあなたがthisための任意の特定の値を設定していないので...あなたは、undefined(まあ、おそらく)を取得します。特定の値がない場合は、グローバルオブジェクトが使用されます。 (window、ブラウザ上で。)

あなたはまた、JavaScript関数のcallまたはapply機能使用してthisを設定することができますとして使用することを目的とするcallに(とapplyへの)最初の引数

var f = Obj.dumb; 
f.call(Obj); // "Johnny" 

this。 (後続の引数が関数に渡され、そうf.call(Obj, 1);を効果的Obj.dumb(1);あろう。applycallと、2番目の引数が関数の引数として使用するアレイので、f.apply(Obj, [1]);を効果的Obj.dumb(1);であろう。)

もっと読み:

+0

'.bind'を使うこともできます:' var f = Obj.dumb.bind(Obj); f(); ':-) –

+1

@Rocket:少なくとも、ES5ブラウザ(またはshimを使用している場合)ではTrueです。 –

0

JSのすべてがオブジェクトです。 thisは「呼び出された関数」ではなく、呼び出されているオブジェクトです(ただし、apply()などを使用しない限り)。

Obj.dumb(); 

のでthis.name"Johnny"に解決しますthis === Objを持つことになります。foodumbと同じ機能になりますが、コンテキストが異なっている、と...

// This won't work 
var foo = Obj.dumb; 
foo(); 

(とthisは、デフォルトのオブジェクトになります。

ちょうどあなたがObj.dumb()を呼び出し、のような何かをしないことを確認してください:window)。

+2

* "JSのすべてがオブジェクトです" * * *まったく*。ほぼすべてですが、プリミティブ( 'String'ではなく、' Number'ではない文字列)を持っています。 –

1

私はここで問題を抱えていると思います。あなたのコードは正常に動作します。

var Obj = { 
    name : "Johnny", 
    dumb : function() { 
     alert(this.name); 
    } 
} 
Obj.dumb(); // Alerts 'Johnny' 

dumbthisに設定されているObjに呼び出されたためです。

EDIT:あなたは次のことをやった場合、それはundefined次のようになります。

var x = Obj.dumb; 
x(); // Alerts '' 

thisは今windowあるためです(機能はもうObjに呼び出されていないとして)。

あなたはどちらかに.call必要があるだろう:

var x = Obj.dumb; 
x.call(Obj); // Alerts 'Johnny' 

それとも.bind(唯一の近代的なブラウザを意味するECMAScript 5):

var x = Obj.dumb.bind(Obj); 
x.call(); // Alerts 'Johnny' 
関連する問題