브라우저의 추세는 Worker와 같은 객체를 점점 더 추가하는 동시에 기존 객체에 새로운 메소드를 추가하는 것입니다. 호환되기 위한 첫 번째 단계는 존재 여부를 감지하는 것입니다. 그렇지 않은 경우 자체 호환성 코드를 추가하십시오. 문제는 이때 발생합니다. 일부 클래스 라이브러리에서는 이 단계를 수행하지만 때로는 수행하지 않지만 표준을 충족하지 않습니다. 따라서 단순히 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*[네이티브 코드] 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[메서드] : false, r = new RegExp(메서드, 'g');
return !!(m && typeof m != 'string' && s === (m '').replace(r , ''));
};
})();