Javascript属性赋值(vanilla)

时间:2016-01-21 18:13:29

标签: 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的浏览器,而不是Android 4等中使用的浏览器。

如您所见,我使用属性赋值来封装引擎检测,而不是污染全局命名空间。

但是 - 对于每个单引擎,我都会创建变量 ua ,这显然不会被重复使用,因此不是最佳实践。

有人可以告诉我如何在引擎对象中定义 var ua 一次吗?

谢谢

2 个答案:

答案 0 :(得分:2)

只需添加该属性,然后使用this

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

答案 1 :(得分:1)

将其放在IIFE

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

IIFE通过创建新的函数作用域来工作,该函数作用域将变量保留在全局作用域之外,然后立即执行该函数。 ua实际上变成了私有变量。它是IIFE的局部变量,但可以由IIFE中定义的任何函数引用。