Javascript 属性赋值(香草)

Javascript property assignment (vanilla)

本文关键字:香草 赋值 属性 Javascript      更新时间:2023-09-26

对于一个小项目,我想创建一个基于引擎检测浏览器的小库:

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 的方法吗?

谢谢

只需添加属性并与this一起使用:

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

将其放在 IIFE 中。

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

IIFE 的工作原理是创建一个新的函数作用域,该作用域将变量排除在全局作用域之外,然后立即执行该函数。 ua有效地成为私有变量。它是 IIFE 的局部变量,但可以被 IIFE 中定义的任何函数引用。