2012-01-12 7 views
4

자바 스크립트 객체 리터럴에 문제가 있습니다.자바 스크립트 객체 참조

I의 기능들 중 하나 내에서 객체를 참조하고자 :

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

안타깝게도 "단순"기능 개체도있다. 따라서 dumb()에는 'name'속성이 없으므로 undefined로 반환됩니다.

어떻게이 문제를 해결할 수 있습니까?

+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에 대한 호출은해야합니다 : 자바 스크립트에서

Obj.dumb(); // "Johnny" 

this 함수가라고 어떻게 에 의해 완전히 정의하지 함수가 어디에 정의된다. 객체 프라퍼티를 통해 함수를 호출하면 this 호출 내에서 객체를 참조합니다. 이 그랬다면 그래서 예를 들어, :

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

당신이 this에 대한 특정 값을 설정하지 않았기 때문에 ... 당신은, (물론, 아마) undefined를 얻을. 특정 값이 없으면 전역 개체가 사용됩니다. (. 브라우저에서 window)

또한 자바 스크립트 기능의 call 또는 apply 기능을 사용하여 this을 설정할 수 있습니다

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

첫 번째 인수 call (및 apply에)에 같이 사용하는 객체입니다 this. (call으로 후속 인자 함수에 전달되므로 f.call(Obj, 1); 효과적으로 Obj.dumb(1); 될 것이다. apply로, 두 번째 인수는 함수의 인자로 사용할 수있는 배열이므로 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 === Obj 그렇게 this.name"Johnny"에 해결할 수있을 것이다. foodumb과 같은 기능이 될 것입니다 반면, 상황은 다르다으로 ...

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

(그리고 this는 기본 객체가 될 것입니다 :

그냥 당신이 Obj.dumb()를 호출하고 그런 짓을하지 않습니다 확인 : window).

+2

* "JS의 모든 것이 객체입니다."* 아니 * 꽤 *. 거의 모든 것, 그러나 우리는 프리미티브 ('String's가 아닌 문자열,'Number's가 아닌 수)를 가지고 있습니다. –

1

여기에 문제가 누락 된 것 같습니다. 코드가 제대로 작동합니다.

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

dumbthis로 설정되어 Obj 호출되기 때문이다.

편집 : 당신이 다음을했다면, 그것은 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'