브라우저의 추세는 작업자와 같은 개체를 점점 더 추가하는 동시에 기존 개체에 새로운 메서드를 추가하는 것입니다. 호환되기 위한 첫 번째 단계는 존재 여부를 감지하는 것입니다. 그렇지 않은 경우 자체 호환성 코드를 추가하십시오. 문제는 이때 발생합니다. 일부 클래스 라이브러리에서는 이 단계를 수행하지만 때로는 수행하지 않지만 표준을 충족하지 않습니다. 따라서 단순히 typeof Array.prototype.map === "function"만으로는 충분하지 않을 수 있습니다. 이때 isNative 메소드가 나타납니다.
내가 사용하던 버전, 직접 작성한 버전:
var isNative = function(method){//네이티브 메소드인지 확인
return !! method && (/{s*[native code]s*}/.test(method "" ) || / {s*/* 소스 코드를 사용할 수 없음 */s*}/.test(method ""));//opera9.x와의 호환성을 위한 것입니다
}
하지만 세상은 이렇습니다. 다음은 Diego Perini의 버전으로, 기본 메소드의 Safari toString 값이 실제로 연결되지 않음을 지적합니다.
var isNative = function(object, method) {
return object && method in object &&
typeof object[method] != string &&
// IE 및 W3C 브라우저는 "[native code]"를 반환합니다.
// Safari < = 2.0.4는 "[function]"을 반환합니다.
(/{s*[native code]s* }|^[function]$/).test(object[method]);
}
내 매개변수보다 매개변수가 하나 더 있습니다. 버전은 네이티브 개체의 메서드를 지정할 수 있지만 하나의 매개 변수 또는 두 개의 매개 변수는 중요하지 않습니다. 결과는 아직 완벽함과는 거리가 멀다는 것을 보여줍니다. 이 두 기능을 합친 경우에도 올바른 완전한 세트가 아닐 수 있습니다.
물론 [네이티브 코드], 소스 코드 없음, [함수] 문제는 아닙니다. JavaScript에서는 다양한 메서드와 개체를 복사하기 쉽기 때문입니다. 예를 들어 다음 코드는 감지 코드를 성공적으로 속일 수 있습니다.
window.test = {
toString : function( ) {
return [function];
}
};
isNative(window, test); // true
드디어 nwmathers에서 찾았습니다. :
var isNative = (function() {
var s = (window.open ).replace(/open/g, );
return function(object, method) {
var m = object ? object[method] : false, r = new RegExp(메서드, g );
return !!(m && typeof m != string && s === (m ).replace(r, ))
})();