2011-11-08 3 views
0

나는 항상 자바 스크립트에서 당신이 실제로 개체로 기능을 확장 할 수 있음은 흥미로운 발견했습니다 (? 다음 그러나, 다시 왜 안)개체를 함수로 "확장"할 수 있습니까?

내가 거기에 위의 작업을 수행하는 많은 이유가 주장하지 않습니다
var order = function(x, y) { 
    return x < y ? [x, y] : [y, x]; 
}; 

order.backwards = function(x, y) { 
    return order(x, y).reverse(); 
}; 

; 내 질문은 간단하게 반대 할 수 있는지 여부입니다. 즉, 다음과 같이 표현할 수 있습니다.

var order = { 
    backwards: function(x, y) { 
     return order(x, y).reverse(); 
    } 
}; 

// Obviously, this is not real; I'm just wondering if there's any way 
// to accomplish the same thing. 
addFunctionBehavior(order, function(x, y) { 
    return x < y ? [x, y] : [y, x]; 
}; 
+0

* "실제로 함수를 객체로 확장 할 수 있습니다."* : 함수 **는 ** 객체이기 때문입니다. 그러나 객체를 afaik 함수로 만들 수는 없습니다. –

+0

@FelixKling : 충분히 공정합니다. 하지만 그건 내 질문을 무효화하지 않는가? –

답변

3

수 없습니다. 당신이 할 수있는 것은 객체를 가져 와서 함수를 반환하는 것입니다. 그들은 Function.prototype 대신 Object.prototype

에서 상속을 제외하고

기억 기능 그들은 또한 호출 할 때 호출되는 내부 [[Call]] 속성이, 객체입니다. 개체를 확장하고 [[Call]] 속성을 부여 할 수 없습니다.

그러나 ES6 proxies (비표준이며 일반적인 브라우저 지원이 있음)을 사용하면 매우 유사한 작업을 수행 할 수 있습니다. 당신은 속성의 이름을 제공하면

0

당신이 할 수 있습니다 :

addFunctionBehavior(order, 'reverse', function(x, y) { 
    return x < y ? [x, y] : [y, x]; 
}; 

제공 : 내가 그 대신에 싶어 왜

function addFunctionBehavior(o, name, fn) { 
    o[name] = fn; 
} 

그러나 내가 모르는 :

order.reverse = function (x,y) { ... } 
관련 문제