2013-06-21 3 views
2

Javascript에서 일부 오래된 코드를 개체 리터럴 표기법으로 변환하고 있으며 약간의 버그 베어를 맞았습니다. 속성을 정의하는 방법을 알고 메서드를 정의하는 방법을 알고 있지만 메서드의 반환 값을 속성으로 지정하려면 어떻게해야합니까?메소드의 반환 값을 Javascript의 다른 객체 속성에 지정하려면 어떻게해야합니까?

Chrome 콘솔에서 오류 출력과 함께 코드를 제공했습니다. 내가 뭘 잘못하고 있는지 알 수는 없지만, 콘솔은 내가 글로벌 범위에 존재하지 않는 것 또는 존재하지 않는 무언가에 가려고하고 있다고 나에게 말하고있다. 여기있다 :

코드 :

var testobj = { 
    a: 2, 
    b: 4, 
    c: function() { 
     return this.a * this.b; 
    }, 
    d: this.c(), // OK, got it, it's trying to call it from global scope. Fine. 
    e: function() { 
     if (this.d) { 
      console.log("SUCCESS"); 
      console.log(this.d); 
     } else { 
      console.log("ERROR"); 
     } 
    } 
} 

오류 :

TypeError: Object [object global] has no method 'c' 

새로운 코드 :

var testobj = { 
    a: 2, 
    b: 4, 
    c: function() { 
     return this.a * this.b; 
    }, 
    d: testobj.c(), // but if I change it like this, it still doesn't work. What gives? 
    e: function() { 
     if (this.d) { 
      console.log("SUCCESS"); 
      console.log(this.d); 
     } else { 
      console.log("ERROR"); 
     } 
    } 
} 

새로운 오류 :

TypeError: Cannot call method 'c' of undefined 

내가 뭘 잘못하고 있는지 누가 알 수 있니?

답변

3

당신은 사용하여 문제를 해결할 수 있습니다.

var testobj = { 
    a: 2, 
    b: 4, 
    c: function() { 
     return this.a * this.b; 
    }, 
    d: function() { 
     return this.c(); 
    }, 
    e: function() { 
     if (this.d) { 
      console.log("SUCCESS"); 
      console.log(this.d); 
     } else { 
      console.log("ERROR"); 
     } 
    } 
} 

당신이 d: this.c()을 수행 할 때 this 실제로 전역 개체입니다 이것은에 있기 때문이다 testobj을 만들 때 범위는 전역 개체이므로 은 전역 개체입니다.

사용하는 경우

d: function() { 
    return this.c(); 
} 

testobj.c을 특정 기능으로 설정하면됩니다. 해당 기능 내에있는 thisd으로 전화 할 때만 평가됩니다. 따라서 d으로 전화하면 범위를 확인하고 범위가 testobj인지 확인합니다. 그리고 testobjc 함수를 가지고 있기 때문에 벽 호출을하고 그것을 반환합니다.

나는 이것을 실제로 실행하기 위해 jsFiddle에 넣었습니다.

0

나는 당신이 d에있는 c의 반환 값을보고 싶어한다고 믿는다.

이 경우 개체를 작성한 후에 var ob = {...}에 인스턴스가 없으므로이 개체 뒤에 d를 할당합니다.

var testobj = { 
    a: 2, 
    b: 4, 
    c: function() { 
     return this.a * this.b; 
    }, 
    e: function() { 
     if (this.d) { 
      console.log("SUCCESS"); 
      console.log(this.d); 
     } else { 
      console.log("ERROR"); 
     } 
    } 
} 

testobj.d = testobj.c(); 

alert(testobj.d); 
alert(testobj.c()); 
+0

이 경우 a 또는 b를 변경하면 'c'가 변경되지만 'd'는 변경되지 않습니다. 이것은 당신이 원하는 것이거나 그렇지 않을 수도 있습니다. 명심할 것. – Peter

+0

예 이것이 OP가 달리 두 가지 동일한 속성을 정의하는 이유를 묻는 것입니다. obj.c() == obj.d()는 항상 같은 결과를 반환합니다. 그러나이 경우 그는 할 수 있습니다 (obj.c()! = obj.d) alert ("changed"); 트리거 변경 기능. –

+0

아하, 사실, 나는 그것을 그렇게 보지 않고 있었다. – Peter

관련 문제