개발 작업을 하다 보면 함수가 JavaScript 네이티브 함수인지 확인해야 하는 상황이 자주 발생합니다. 때로는 해당 함수가 브라우저 자체에서 제공되는지 아니면 브라우저에서 제공되는지 알아야 하는 경우가 있습니다. 타사 캡슐화 및 기본 기능으로 위장. 물론 가장 좋은 방법은 이 함수를 실행하는 toString 메서드의 반환 값을 검사하는 것입니다.
자바스크립트
이 작업을 완료하는 방법은 매우 간단합니다.
더 강력한 방법
Lodash 창립자 John-David Dalton이 더 나은 솔루션을 찾았습니다.
// 값의 내부 `[[Class]]`를 해결하는 데 사용됩니다
var toString = Object.prototype.toString;
// 디컴파일된 함수 소스를 해결하는 데 사용됩니다
var fnToString = Function.prototype.toString;
// 호스트 생성자를 감지하는 데 사용됩니다(Safari > 4; 실제 형식화된 배열에 따라 다름)
var reHostCtor = /^[객체 ?생성자]$/;
// 일반적인 네이티브 메서드를 템플릿으로 사용하여 정규식을 컴파일합니다.
// 문제가 발생하지 않을 가능성이 높기 때문에 `Object#toString`을 선택했습니다.
var reNative = RegExp('^'
// `Object#toString`을 문자열로 강제 변환
문자열(toString)
// 특수 정규식 문자를 이스케이프 처리하세요
.replace(/[.* ?^${}()|[]/\]/g, '\$&')
// `toString`에 대한 언급을 `.*?`로 대체하여 템플릿을 일반화합니다.
// 추가 정보를 추가하는 Rhino와 같은 환경을 지원하려면 `for ...`와 같은 항목을 교체하세요
// 메소드 인자성 등.
.replace(/toString|(함수).*?(?=\()| for . ?(?=\])/g, '$1.*?') '$'
);
함수 isNative(값) {
var type = 값 유형;
반환 유형 == '함수'
// 값 자체의 `toString` 메서드를 우회하려면 `Function#toString`을 사용하세요
// 속이는 일을 피하세요.
? reNative.test(fnToString.call(값))
// 일부 환경에서는
을 나타내기 때문에 호스트 개체 검사로 대체합니다.
//
을 따르지 않을 수 있는 DOM 메서드와 같은 형식화된 배열과 같은 것
// 일반적인 네이티브 패턴.
: (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
}
// 원하는 대로 내보내기
module.exports = isNative;
}());