2016-01-21 115 views
1

一個小項目,我想讓其基於他們的引擎的瀏覽器一個小小的圖書館:JavaScript屬性賦值(香草)

var engine = { 
opera: function(){ 
    var ua = navigator.userAgent.toLowerCase(), 
     version = ua.match(/opera[\/\s](\d+\.\d+)/); 
    if (version){ 
     return parseFloat(version[1]); 
    } 
}, 
webkit: function(){ 
    var ua = navigator.userAgent.toLowerCase(), 
     version = ua.match(/applewebkit\/([\d.]+)/); 
    if (version && !engine.opera()){ 
     return parseFloat(version[1]); 
    } 
}, 
gecko: function(){ 
    var ua = navigator.userAgent.toLowerCase(), 
     version = ua.match(/rv\:([\w\.]+).\s(gecko)/); 
    if (version && !engine.opera()){ 
     return parseFloat(version[1]); 
    } 
}, 
ie: function(){ 
    var ua = navigator.userAgent.toLowerCase(), 
     version = ua.match(/msie (\d+\.\d+)/); 
    if (version && !engine.opera()){ 
     return parseFloat(version[1]); 
    } 
}, 
touch: function(){ 
    var ua = navigator.userAgent.toLowerCase(); 
    if (ua.match(/android|ipod|iphone|ipad|iemobile|bb[\d]\d|blackberry|playbook|silk|touch|mobile/)){ 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

};

調用具有:engine.webkit()<534.3檢查,如果這是一個WebKit的基於瀏覽器比是在安卓4.0等使用舊的

正如你看到我使用屬性賦值來封裝發動機檢測,不污染全球命名空間。

但是 - 對於每個單引擎,我創建的變量ua,顯然它沒有被重用,因此也不是最佳實踐。

有人可以告訴我如何在引擎對象內定義var ua一次嗎?

謝謝

+3

只需添加'ua'到'engine'對象,然後改變所有的功能,裏面的'ua'引用'this.ua' – MinusFour

回答

2

只需添加屬性及與this使用:

ua: navigator.userAgent.toLowerCase(), 
opera: function { 
    this.ua // The reusable 
+0

所以你的解決方案意味着,當我調用'engine.opera()'時,這又調用了存儲useragent的'ua屬性'。例如,當我調用'engine.webkit()'時,useragent已經被緩存在'ua屬性'內? –

+0

它存儲在實例化中,除非手動更新,否則不會更新! – ryan0319

1

將其放置在一個IIFE

var engine = (function() { 
    var ua = navigator.userAgent.toLowerCase(); 
    return { 
    opera: function() { ... }, 
    // etc. 
    }; 
})(); 

的IIFE通過創建一個新的功能範圍,這使變量了全球範圍內的,然後立即執行該功能。 ua實際上變成了一個私有變量。它是IIFE的局部變量,但可以由IIFE中定義的任何函數引用。

+0

謝謝。也是一個整潔的解決方案! –