개발 작업에서 종종 함수가 JavaScript 기본 기능인지 여부를 결정 해야하는 상황을 종종 만나게됩니다. 때때로 이것은 매우 필요한 작업입니다. 이 기능이 브라우저 자체에 의해 제공되는지 또는 제 3자가 기본 함수로 캡슐화하고 위장하는지 여부를 알아야합니다. 물론 가장 좋은 방법은이 기능을 실행하는 Tostring 메소드의 반환 값을 검사하는 것입니다.
자바 스크립트
이 작업을 수행하는 방법은 매우 간단합니다.
코드 사본은 다음과 같습니다.
기능 (fn) {
return (// {/s*/[기본 코드/]/s*/}/). test ( '' + fn);
}
Tostring 메소드는이 메소드의 문자열 형식을 반환 한 다음 정규식을 사용하여 포함 된 문자를 결정합니다.
더 강한 방법
Lodash의 창립자 인 John-David Dalton은 더 나은 해결책을 찾았습니다.
코드 사본은 다음과 같습니다.
;(기능() {
// 값의 내부`[[class]]`를 해결하는 데 사용됩니다
var tostring = object.prototype.tostring;
// 소환 된 기능 소스를 해결하는 데 사용됩니다
var fntostring = function.prototype.tostring;
// 호스트 생성자를 감지하는 데 사용
var rehostctor =/^/[object.+? 생성자/] $/;
// 공통 기본 메소드를 템플릿으로 사용하여 regexp를 컴파일합니다.
// 우리는``Object#Tostring ''을 선택합니다.
var renative = regexp ( '^' +
//`객체#toString`은 문자열에 코어를 강요합니다
문자열 (Tostring)
// 특수 regexp 문자를 탈출합니다
.replace (/[.*+?^$ {} () | [/] ///]/g, '// $ &')
//`tostring`에 대한 언급을`.*?`로 대체합니다.
// 추가 정보를 추가하는 Rhino와 같은 환경을 지원하기 위해`for ... '와 같은 것을 교체하십시오.
// 메서드 아티리티와 같은.
.replace (/tostring | (함수).*? (? = // () | for. +? (? = //])/g, '$ 1.?') + '$'
);
기능 (가치) {
var type = typeof 값;
return type == 'function'
//`function#toString`을 사용하여 값의 'TOSTRING'방법을 우회합니다.
// 가짜를 피하십시오.
? renative.test (fntostring.call (value))
// 일부 환경이 나타나기 때문에 호스트 오브젝트 확인 붕괴
// 타이핑 된 배열과 같은 것은 DOM 메소드로서
// 일반적인 기본 패턴.
: (value && type == 'object'&& regostctor.test (tostring.call (value)) || 거짓;
}
// 원하는하지만 원하는 내보내기
module.exports = iSnative;
} ());
이제 당신도 그것을보고, 그것은 매우 복잡하지만 더 강력합니다. 물론 이것은 보안 보호를위한 것이 아니라 기본 기능인지에 대한 관련 정보를 제공합니다.