Javascript - 메소드 프로토 타입이 변경되었는지 확인 하시겠습니까?


3

메소드의 프로토 타입이 변경되었는지 확인하는 가장 좋은 방법은 무엇입니까?

8

함수에 대해 toString()을 수행하면 함수의 소스 코드가 생성됩니다. 네이티브 함수의 경우, FF, IE, Opera 및 Chrome은 [native code] 본문이있는 함수를 반환합니다. 그러나 Chrome은 대부분의 기능을 자바 스크립트에서 구현하고 있으며 대부분의 기능에 대한 소스를 반환합니다 (Object.constructor는 Chrome에서 원시 코드를 반환하는 몇 가지 기본 기능 중 하나임)

아래에서 정규 표현식 [native code]를 확인합니다. (함수가 호출되지 않을 때 자동으로 수행되므로 toString()을 호출 할 필요가 없습니다). 그것은 FF3, IE7, 오페라 9.6 및 크롬 1 테스트되었습니다.하지만 말했듯이, 크롬은 대부분의 기능에 대한 실제 소스 코드를 반환하므로 브라우저에서 테스트하는 것은 유용하지 않습니다.

function isNative(func) { 
    return /^\s*function[^{]+{\s*\[native code\]\s*}\s*$/.test(func); 
} 


alert(isNative(Array.prototype.push)); 

업데이트

기본 방법은 Array.prototype.push = Math.abs 같은 다른 네이티브 메소드로 교체 할 경우 위의 코드는 물론 검색하지 않습니다. 그런 종류의 변경을 감지하거나 자신의 개체의 메서드가 변경된 경우 원본 메서드를 변수에 저장 한 다음 변경된 것으로 의심되는 함수를 실행 한 다음 저장된 메서드와 비교해야합니다.

그러나 op에서 olliejanswer에 대한 설명을 읽은 후에 OP는 네이티브 개체의 메서드가 변경되었는지 검색하는 방법을 알고 싶었습니다. 변경된 경우 일반적으로 브라우저가 네이티브가 아닌 메소드를 추가하거나 예상되는 표준과 호환되도록 동작을 변경하기 위해 일반적으로 다른 원시 코드로 대체되지 않고 새로운 코드로 대체됩니다. 이 경우 위의 코드는 FF, IE 및 Opera에서는 작동하지만 Crome에서는 작동하지 않습니다.

다음 코드가 사용할 수있는 모든 유형의 변경 사항을 감지하려는 경우. 다음 함수는 을 저장하고과 비교하는 두 가지 방법으로 개체를 만듭니다. 저장은 개체가 생성 될 때 arguments가 제공되면 자동으로 호출됩니다. 저장은 첫 번째가 개체이고 나머지가 저장할 메서드 이름 인 두 개 이상의 인수가 필요합니다. 메서드의 이름을 지정해야하는 이유는 대부분의 내부 개체가 메서드에 "-flag가 설정되어 있지 않으므로"열거하지 않습니다. "

  0

'Array.push = Math.abs'를 수행하면 이것이 작동하지 않습니다. 그 이유는 제가 그 대답에 제안하지 않았기 때문입니다. 22 feb. 092009-02-22 23:16:53

  0

@olliej : 그것은 암시되었지만 어쨌든 대답을 업데이트했습니다. 23 feb. 092009-02-23 04:24:52


2
그것은 당신이 당신이 사이에 변경 의미가 "변화"가 무엇을 의미하는지에 따라 달라집니다

코드가로드되는 일부 나중에, 당신은 단지 라

var oldFunc = SomeType.prototype.someFunction; 
... 
if (oldFunc === someInstance.someFunction) //unchanged, note the use of strict equality 

그러나 만약 함수에 대한 참조를 저장할 수 있습니다 때 기본 네이티브 구현이 변경되었다는 것을 알 수있는 실제 방법이 없습니다.

  0

따라서 Prototype과 같은 일부 라이브러리는 Array.prototype.push 또는 pop과 같은 핵심 객체 프로토 타입을 수정합니다. 그래서 네이티브 객체의 기본 프로토 타입 메서드가 변경되었는지 확인할 수 있는지 궁금합니다. 22 feb. 092009-02-22 10:19:49