javascript如何列出全局對象的非原生屬性。

Why

研究一個網站前端技術的時候,瞭解它的全局的對象是一個好的入口,
通常來講,常見的庫就會用外觀模式,最後暴露一個對象給用戶調用,
好比jQuery,requirejs,angular,react
均是用這種方式。javascript

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

如React
前端

同時,爲了不全局污染,也要關注全局變量的個數和詳情。java

How

能夠經過ES5的新增api(Object.keys)看瀏覽器全局變量列表:Object.keys(window)node

發現通常的網站都有兩百多個全局變量,人力去看且須要區分是不是用戶定義的比較困難,須要一個script去列出全部的非原生的全局屬性.react

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

但並非全部的原生對象都是seaded. 因此此方法行不通。web

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

對於瀏覽器環境,咱們有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的全局對象:

Node怎麼處理

因爲node沒有像Chrome Dev Tools Console同樣的工具,能夠直觀簡單的執行js代碼片斷,

對於Nodejs,能夠在應用運行穩定(全部的全局,單例對象都初始化完成)後,再導出全局對象,

再在同一環境,不導入任何庫導出全局對象,進行對比便可。

怎麼知道一個原生函數有沒有覆蓋

因爲Function.prototype.toStringAPI,對原生函數返回[native code]

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

但對於自定義的函數會返回源碼:

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

angular就是利用這一特性實現依賴注入http://www.cnblogs.com/etoah/p/5460441.html

能夠用此特性,來檢測是不是原生的api(僅適用於瀏覽器運行環境,node環境有差別).

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

相關文章
相關標籤/搜索