99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學院 頭像
蘋果6袋
6
麥子學院

使用javascript列出全局對象的非原生屬性方法詳解

發(fā)布時間:2016-11-11 22:53  回復(fù):0  查看:1971   最后回復(fù):2016-11-11 22:53  

研究一個網(wǎng)站前端技術(shù)的時候,了解它的全局的對象是一個好的入口,

一般來說,常見的庫就會用外觀模式,最后暴露一個對象給用戶調(diào)用,

比如jQuery,requirejs,angular,react均是用這種方式。

如果沒有用cmd/amd模塊化或類似webpack工具打包的話,會給全局對象window添加一個屬性,如angular:

使用javascript列出全局對象的非原生屬性方法詳解

    React

使用javascript列出全局對象的非原生屬性方法詳解


同時,為了避免全局污染,也要關(guān)注全局變量的個數(shù)和詳情。

How

可以通過ES5的新增api(Object.keys)看瀏覽器全局變量列表: Object.keys(window)

發(fā)現(xiàn)一般的網(wǎng)站都有兩百多個全局變量,人力去看且需要區(qū)分是否是用戶定義的比較困難,需要一個 script 去列出所有的非原生的全局屬性.

開始想的是能不能防篡改對象的相關(guān)檢測api(Object.isExtensible,Object.isSealed,Object.isFrozen)來判斷是否原生api

但并不是所有的原生對象都是seaded. 所以此方法行不通。

那么能不能有一個純凈的、沒有加載第三方庫的全局對象?

對于瀏覽器環(huán)境,我們有iframe

可以添加一個iframe,然后對比當前的window,就可以得到詳細列表。

var iframe = document.createElement("iframe");document.body.appendChild(iframe);Object.keys(iframe.contentWindow).length

列出非原來對象

(function(){

var iframe = document.createElement("iframe");

document.body.appendChild(iframe);

var originWindow=iframe.contentWindow,

currentWindow=window

var origin =Object.keys(originWindow),

current =Object.keys(currentWindow),

extendAttr={};

current.forEach((key)=>{

if(originWindow[key]===undefined){

extendAttr[key]=currentWindow[key]

};

})

console.log(`origin window:${origin.length},current window:${current.length},extentAttr:${Object.keys(extendAttr).length}`)

console.log("extendAttr:",extendAttr);

document.body.removeChild(iframe);

})();

cnblogs的全局對象:

使用javascript列出全局對象的非原生屬性方法詳解


Node怎么處理

由于node沒有像Chrome Dev Tools Console一樣的工具,可以直觀簡單的執(zhí)行js代碼片段,

對于Nodejs,可以在應(yīng)用運行穩(wěn)定(所有的全局,單例對象都初始化完成)后,再導(dǎo)出全局對象,

再在同一環(huán)境,不導(dǎo)入任何庫導(dǎo)出全局對象,進行對比即可。

怎么知道一個原生函數(shù)有沒有覆蓋

由于 Function.prototype.toString API,對原生函數(shù)返回 [native code]

setTimeout.toString()"function setTimeout() { [native code] }"

但對于自定義的函數(shù)會返回源碼:

jQuery.toString()"function (e,t){return new x.fn.init(e,t,r)}"

可以用此特性,來檢測是否是原生的api(僅適用于瀏覽器運行環(huán)境,node環(huán)境有差異).

一個原生屬性(Object,string...)怎么檢測有沒有被用戶重置,除了用 typeof 檢測數(shù)據(jù)類型, 本人暫沒有更好的方案,歡迎討論。

 

文章來源:博客園

您還未登錄,請先登錄

熱門帖子

最新帖子

?