2011-02-05 4 views
5

있습니다. 이런 식으로 뭔가를 할 수있는 방법이 있다면 궁금해하던가요?자바 스크립트 기능이 작동 코드 하위 기능/변수를

var test = { 
    this: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 
+1

함수는 객체이지만 객체는 함수가 아닙니다. 물론 객체 속성으로 함수를 저장할 수 있지만 일반 객체를 "호출 가능"으로 만들 수는 없습니다. 또는 실제로 달성하고자하는 것은 무엇입니까? 두 번째 방법의 이점은 무엇입니까? –

+0

그냥 test() 함수를 사용하여 test.this() 함수를 호출하고 싶습니다. – Ragnis

+0

@ Felix 요점을 놓치고 있다고 생각합니다. 저는 모든 정보를 캡슐화하려고 노력 중이며 더 깔끔하고 체계적인 접근 방법을 사용하고 있다고 생각합니다. – xil3

답변

5

내 의견에 말했듯이 "호출 가능"개체를 만들 수 없습니다.

function extend(func, props) { 
    for(var prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      func[prop] = props[prop]; 
     } 
    } 
    return func; 
} 

을 다음과 전화 : 당신은 그러나 첫 번째 예에서 프로세스를 자동화 할 수 있습니다 말했다

var test = extend(function(){ 
    console.log(test.data); 
}, 
{ 
    data: 'hello',  
    set: function (data) { 
     this.data = data; // note that I changed it to `this.data` 
    } 
}); 

DEMO


, 난 당신이 같은 기능을 사용하지한다고 생각합니다 그. "정상적인"개체를 갖고 있고 obj() 대신에 모든 메서드를 obj.method()으로 호출하면 이해하기가 더 쉽습니다.

최소한이 사실을 매우 신중하게 기록해야합니다.

+0

'hasOwnProperty' 호출은 어디에 있습니까? ;) –

+0

@Ivo Wetzel : 음, 어쨌든 평범한 객체 만 전달할 것이라고 가정했지만 ... 그렇습니다 ... Object.prototype'의 확장 ... bla bla ... (언젠가 그들이 내장을 만들길 바란다. 프로토 타입 ** 확장 가능하지 않습니다!) ... 고정 :) –

+0

그건 좋은 일이지만, 나는 그들이 그렇게 할 것입니다 의심 : / –

0

개체의 속성에 모든 기능을 저장할 수 있습니다. 그리고 그들을 호출 할 수 있습니다 :

let f = { fun1: function() 
       { 
        return 1; 
       } 
     }; 
f.fun1(); 

완벽하게 작동 할 것입니다. 나는 이것이 키워드이기 때문에 당신이 'this'를 속성 이름으로 사용할 수 있는지 확신하지 못한다. 아마도 문제는 아니지만 오도 된 것일 수 있습니다.

+0

실제로 두 번째 예제는 의사 코드와 비슷했습니다. – Ragnis

2

어떻게 이런 식으로 뭔가를하고 약 :

function Test() { 
    this.data = 'hello'; 
    this.set = function (data) 
    { 
     test.data = data; 
    } 
    this.log = function() 
    { 
     console.log(test.data); 
    } 
} 

var test = new Test(); 
test.set('Test'); 
test.log(); 

이 쉽게 새로운 인스턴스를 만들 수있는 장점이있다.

var test = { 
    log: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 

test.set('Test'); 
test.log(); 

그러나 아마 귀하의 질문에 어떻게 피하기 된 ".LOG"부분을 : 당신은 단지 일회성를 원하는 경우


, 나는 당신의 자신의 제안을 당신이 원하는 것을 거의 말할 것인가?

+0

예, ".log"부분은 피하고 싶습니다. – Ragnis

+0

그래서 로그를 본질적으로 생성자에 넣으시겠습니까? – xil3

관련 문제