2016-07-25 59 views
5

例如,我在某個網站上加載了一個腳本,我想知道JSON.parse/stringify是不是被修補的。有沒有辦法來檢查一個本地的JavaScript函數是否被猴子修補?

我注意到,如果我使用的toString上使用Chrome/FF,JSON.stringify.toString的功能,然後我回去:

function stringify() { 
    [native code] 
} 

我的問題是你認爲這是覈實,如果一個函數是一個很好的方法猴子補丁?也很想聽聽任何其他解決這個問題的方法。

+2

也許您可以在WebWorker中運行您自己的腳本,並將工作內部的功能與主頁面中的功能進行比較。 – Buzzy

回答

4

是的,這是檢查本機函數是否被覆蓋或不覆蓋的唯一實用方法。

const isNative = fn => !!fn.toString().match(/\[native code\]/) 

console.log(isNative(JSON.stringify)); 

一個更強大的解決方案可以使用Function.prototype.toString()代替fn.toString()直接調用,但兩者都monkeypatchable爲好。的JavaScript的樂趣:)

4

人們可以很容易地假冒JSON.stringify.toString

JSON.stringify = function() {} 
JSON.stringify.toString = function() {return 'ha-ha'} 

console.log(JSON.stringify); //ha-ha 

多一點可靠的方法是使用Function.prototype.toString

Function.prototype.toString.call(JSON.stringify) 

但真的不好monkeypatcher可以修補Function.prototype.toString以及:)

3

規範(http://www.ecma-international.org/ecma-262/7.0/index.html#sec-function.prototype.tostring)未指定爲內置函數返回的確切字符串於:

19.2.3.5 Function.prototype.toString

當toString方法被稱爲上的對象FUNC,採取以下 步驟:

如果FUNC是綁定函數異國對象,然後返回一個 實現依賴 func的字符串源代碼表示。 該表示必須符合以下規則。它是 實現取決於該表示是否包含綁定的 函數信息或有關目標函數的信息。如果 類型(func)是對象,並且是內置函數對象或具有[[ECMAScriptCode]]內部插槽,則返回 與實現相關的字符串源代碼func的表示形式。 該表示必須符合以下規則。拋出TypeError 異常。的toString表示要求:

字符串表示必須有一個 FunctionDeclaration,FunctionExpression,GeneratorDeclaration, GeneratorExpression,ClassDeclaration,ClassExpression,ArrowFunction, MethodDefinition,或GeneratorMethod取決於對象的實際特性 的語法。在表示字符串中使用和放置空格, 行結束符以及分號是 實現相關。如果使用ECMAScript 代碼定義對象,並且返回的字符串表示形式不是 MethodDefinition或GeneratorMethod,則表示必須是 ,這樣如果字符串被評估,則在詞法上下文中使用eval 等效於用於創建原始對象的詞法上下文,它將導致一個新的功能等同的對象。在 這種情況下,即使這些「額外」名稱最初在範圍內,返回的源代碼也不能自由提及原始函數的 源代碼未提及的任何 變量。如果 實現不能產生滿足 這些條件的源代碼字符串,則它必須返回一個字符串,eval將拋出 SyntaxError異常。

因此,檢查[Native Code]可能或不可能取決於解釋器。此外,一個實現可以很好地實現內置函數作爲正常的JavaScript代碼。

因此,在回答您的問題時,您無法確定,是否使用Javascript指定的方式確定內置函數是否已被猴子修補。

這表示Chrome和Firefox都會返回[Native Code]字符串,但需要在其他可能是實用解決方案的實現上進行驗證。

+0

*「此外,一個實現可以很好地實現內置函數作爲正常的JavaScript代碼。」*這可能不是一個問題。 V8的'Promise' [用JavaScript實現](https://github.com/v8/v8/blob/986814218b907cbac244a3624362ee9351f6badb/src/js/promise.js)和'Promise.toString()'仍然有'[native code] ' 在裏面。 – noppa

+0

有趣.... – HBP

相關問題