2011-09-07 6 views
8

일반적인 수준에서 "호출"기능을 재정의 할 수 있으므로 앱에서 아무 곳에서나 메서드가 호출 될 때마다 아무런 문제가 발생하지 않습니다."호출"기능을 무시할 수 있습니까?

Object.call을 덮어 쓰려고 시도했지만 관리 할 수는 있지만 내 앱 작동 방식을 변경하지 않았습니다.

BTW가 작동하더라도 매번 "foo.call (this, args)"을 명시 적으로 호출해야합니까? 아니면 일반 함수 호출도 "foo (args)"를 작동해야합니까?

+0

'Function.call'을 생각 하시나요? 'Object.prototype'에'call' 메서드는 없습니다. –

+0

아마 당신은 당신이 정말로 성취하려는 것을 설명 할 수 있습니다. 나는 자바 스크립트 레벨에서 모든 자바 스크립트 함수 호출을 인터셉트 할 수 있다고 생각하지 않는다.JS 엔진 내부의 일부 훅에 액세스해야 할 수도 있습니다. – jfriend00

답변

8

는 ECMAScript의 같은 호출 객체의 개념을 가지고, ...

자바 스크립트를 소리. 호출 가능한 모든 객체에는 내부 속성[[Call]]이 있습니다. 이 속성은 ECMA-262 사양, 제 5 판의 섹션 8.6.2, 표 9에 설명되어 있습니다. 그것은 :

개체와 관련된 코드를 실행합니다. 함수 호출 식을 통해 호출됩니다. SpecOp에 대한 인수는이 개체와 함수 호출 식에 전달 된 인수가 포함 된 목록입니다. 이 내부 메소드를 구현하는 객체는 호출 가능합니다. 호스트 객체 인 호출 가능 객체 만 참조 값을 반환 할 수 있습니다.

내부 속성은 이름이없는 및 ECMAScript를 언어 사업자를 통해 직접 액세스 할 수 없습니다 :

는 그러나주의해야 할 것은 [[Call]]은 사양 말한다하는 내부 속성이라고합니다. 내부 속성은 사양 용도로만 존재합니다.

그래서이 자바 스크립트 코드에는이 메커니즘을 사용할 수 없습니다.

지금 Function.prototype, applycall에 정의 두 가지 방법이있다. Function.prototype.call의 정의를 변경하면 자신의 함수 f을 생성하면 f.call이 참으로됩니다 (f의 프로토 타입 또는 f 자체에서 재정의되지 않는 한) 실제로 해당 코드가 실행됩니다. 이것은 예상대로 자동으로 f을 호출하여 발생하지 않습니다. 명시 적으로 call 메서드를 호출해야합니다.

모든 것이 내장 객체의 프로토 타입에 미리 정의 된 표준 방법을 사용하지 않는 것이 가장 좋습니다. 라이브러리 및 응용 프로그램의 많은 기존 코드는 Function.prototype.call에 의존합니다. 그것을 망쳐 놓지 마십시오. 물론 여러 가지 방법으로 일종의 AOP 동작을 구현할 수 있습니다. 하나는 Function.prototype 다른 방법으로 에 추가하는 것이지만 중 하나를 수행하지 마십시오. 또 하나는 이전과 이후의 훅을 사용하여 자신의 호출 메소드를 작성하는 것입니다.

function call(theThis, before, main, after, beforeArgs, mainArgs, afterArgs) { 
    before.apply(theThis, beforeArgs); 
    main.apply(theThis, mainArgs); 
    after.apply(theThis. afterArgs); 
} 
+0

나는 원래 호출 함수의 사본을 항상 캐시하고 그 호출을 마지막에 호출한다. – user802232

0

즉, 응용 프로그램에서 수행 된 모든 함수 호출을 차단하고 싶습니까? 적어도 일반적인 수준에서는 그러지 못합니다. 여기에 측면 지향 프로그래밍의 어떤 종류의 일을 할 것처럼

관련 문제