2012-11-10 5 views
2

의 내가 함수를 가정 해 봅시다 :다른 방법으로 객체에서 호출 가능 함수를 만들 수 있습니까?

var func = function(param){return param + 1;}; 

기능은 객체가 있음을 감안할 때, 나는 그것에 속성을 추가 할 수 있습니다

func.prop = 'foo'; 
모두 func(4)

func.prop 작동합니다. 하지만 이제 객체가 있다고 가정 해 보겠습니다.

var obj = {prop: 'foo'}; 

... 나는 increment 함수로 호출 가능하게 만들고 싶습니다. 이것이 가능한가?

+1

나는 비슷한 질문을 너무 오래 전에하지 않았다. 여기를 보아라. http://stackoverflow.com/questions/13227623/custom-function-class – SpaceFace

+3

... "증분 함수로"... ... ** 무엇? ** – Pointy

+0

블래스트 된 코멘트 타이머. 당신의 아이디어는 내 것보다 간단 해 보입니다. 어떤 캐시 된 속성이있는 함수를 사용할 수없는 이유가 있습니까? 함수에 접근해야한다면'arguments.callee'를 사용하여 함수를 참조 할 수 있습니다. 나는 당신이'this'가 여전히'window'를 참조하는 함수처럼 행동 할지라도'this'가 작동하기를 원한다고 가정합니다. 당신이하려는 일에 대해 더 많은 정보를 주시겠습니까? 이렇게? http://jsfiddle.net/YhxDD/ – SpaceFace

답변

4

[Ojbect]를 증가 기능으로 호출 가능하게 만들고 싶습니다. 이것이 가능한가? 따라서 내부 [[Call]] 방법이없는 개체 생성자에 의해 만들어지고

번호

객체는 호출 할 수 없습니다. 함수를 함수로 만드는 특별한 [[Call]] 메서드입니다. Object 생성자는 Function이지만 함수가 아닌 일반 Object를 만듭니다.

함수가 Object.prototype에서 상속하는 동안 created by the Function constructor입니다. 붙박이 생성자는 ECMA-262에 의해 그들에게 주어진 여분의 힘을 가지고있다. :-)

1

이것은 나쁜 생각입니다 (IMO, 절름발이 구문 당에 많은 오버 헤드가 있습니다).하지만 그렇게 할 수 있습니다. 이제

function InvokableObject(properties) { 
    var propName, 
     invoke = properties.invoke, 
     fn = typeof invoke === 'string' ? 
      function() { 
       return fn[invoke].call(fn, arguments); 
      } : 
      function() { 
       return invoke.call(fn, arguments); 
      }; 
    delete properties.invoke; 
    for (propName in properties) { 
     if (properties.hasOwnProperty(propName)) { 
      fn[propName] = properties[propName]; 
     } 
    } 
    return fn; 
} 

, 당신은 "호출"속성으로 함수를 지정할 수 있으며 개체를 호출 할 때, 그것은 실행됩니다 :

var incrementable = InvokableObject({ 
    value: 0, 
    invoke: function() { 
     this.value += 1; 
     return this.value; 
    } 
}); 

console.log(incrementable.value); //0 
console.log(incrementable()); //1 
console.log(incrementable()); //2 

다른 방법으로, 당신은 invokation 함수의 이름을 지정할 수 있습니다 :

var incrementable = InvokableObject({ 
    value: 0, 
    invoke: 'increment', 
    increment: function() { 
     this.value += 1; 
     return this.value; 
    } 
}); 

console.log(incrementable.value); //0 
console.log(incrementable()); //1 
console.log(incrementable()); //2 

진지하게,하지 마세요. 그냥 obj.increment 나 뭐든지 불러주세요.

관련 문제