>  기사  >  웹 프론트엔드  >  함수가 JavaScript 네이티브인지 감지하기 위한 팁 function_javascript 팁

함수가 JavaScript 네이티브인지 감지하기 위한 팁 function_javascript 팁

WBOY
WBOY원래의
2016-05-16 16:09:571031검색

개발 작업을 하다 보면 함수가 JavaScript 네이티브 함수인지 확인해야 하는 상황이 자주 발생합니다. 때로는 해당 함수가 브라우저 자체에서 제공되는지 아니면 브라우저에서 제공되는지 알아야 하는 경우가 있습니다. 타사 캡슐화 및 기본 기능으로 위장. 물론 가장 좋은 방법은 이 함수를 실행하는 toString 메서드의 반환 값을 검사하는 것입니다.

자바스크립트

이 작업을 완료하는 방법은 매우 간단합니다.

코드 복사 코드는 다음과 같습니다.

함수 isNative(fn) {
return (/{s*[네이티브 코드]s*}/).test('' fn);
}

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;
}());


이제 보시다시피 복잡하지만 더욱 강력합니다. 물론 이는 보안 목적이 아니며 단지 기본 기능인지 여부에 대한 정보를 제공할 뿐입니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.