2017-02-06 2 views
1

core-js (예 : babel-polyfill)으로 폴리필 된 기능이 기본으로 표시됩니다.core-js/babel-polyfill 폴리 채워진 기능이 [기본 코드]로 표시됩니다.

Promise.race.toString()는 생산 :

function race() { 
    [native code] 
} 

그래서 Object.values.toString() 않습니다.

확실히 브라우저의 기본 구현은 아니지만. 예는 Babel REPL 페이지입니다.

함수가 고유 구현이 아니라 고유 함수를 모방 한 polyfill (예 : 특정 polyfill이 응용 프로그램에서 문제를 일으킬 수 있음을 알고있는 경우)을 프로그래밍 방식으로 검사 할 수 있습니까?

보통 native code regexp가 도움이되지만 확실히 그렇지 않습니다.

어떻게 이러한 기능에서 소스 코드를 검색 할 수 있습니까? 나는 주로 Node.js에 관심이 있지만 크로스 플랫폼 솔루션을 환영합니다.

정확히 어떻게이 트릭이 완료 되었습니까? native code 검색에 대해 core-jsbabel-polyfill 소스 코드를 검색 할 수 없습니다. 그 polyfilled 기능을 할

답변

3

core-js 시도는 기본적으로 다시 기본에 해당하는 버전으로 Function.prototype.toStringhere를 대체하여 구현하지만 fn[SRC]에 값을 설정하여 원하는 경우 문자열 값을 대체하는 코어 JS 수 있습니다 나타납니다.

당신은 .join(String(key))를 호출 할 때 그래서 당신이

function race() { [native code] } 
와 끝까지 당신이이 경우에 TPL를 검사하는 경우 특히

if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); 

는, ["function ", "() { [native code] }"]입니다, 더 멀리까지 해당 파일이 fn[SRC] 할당 here에서 볼 수 있습니다

출력에 표시됩니다.

+0

우수함,이 설명 그것. – estus

+0

질문의 다른 부분에 대한 아이디어가 있습니까? 함수가 폴리 폴리되었는지 테스트하는 방법은 무엇입니까? 네가 공헌자 중 하나라고 생각하지? – estus

+0

불행히도 그렇게하는 것이 어렵다고 생각합니다. 'core-js '가로드되기 전에'Function.prototype.toString'에 대한 참조를 얻을 수 있다면 가장 쉽습니다. 당신이 그것을 찾으려고 노력하고있는 것에 대해 자세히 설명해 주시겠습니까? 저는 몇 가지를 기부했지만 바벨에 중점을 두었습니다. 그래서 저는 전문가도 아닙니다. – loganfsmyth

0

Polyfilled core-js 기능은 unique property which is defined by the library이고 Symbol(src)_1.g50a4eqv8s8xgvi과 같이 내부적으로 저장됩니다. 이렇게하면 라이브러리가 라이브러리를 식별하고 toString() 결과를 위조 할 수 있습니다 (다른 대답이 철저히 설명 됨).

그것은 고유의 속성을 감지하고 계시 실제 함수 본문에 core-js 속임수 할 수 있습니다 : 나는 시도했습니다 때`Promise.race.toString = Function.toString`가 영향을 미치지 아니 왜

function getPolyfillUid(fn) { 
    return Object.getOwnPropertyNames(fn).find(prop => /^Symbol\(.+\)_/.test(prop)) 
} 

function toTrueString(fn) { 
    const uid = getPolyfillUid(fn); 
    let fnString; 
    if (uid) { 
     const uidDescriptor = Object.getOwnPropertyDescriptor(fn, uid); 
     delete fn[uid]; 
     fnString = fn.toString(); 
     Object.defineProperty(fn, uid, uidDescriptor); 
    } else { 
     fnString = fn.toString(); 
    } 

    return fnString; 
}