从JS函数的原型中获取预计算变量/属性的标准方法

Standard way to get a pre-calculated variable/property from a JS function's prototype

本文关键字:变量 属性 计算 标准 方法 获取 函数 JS 原型      更新时间:2023-09-26

我正在寻找一次计算变量的标准方法,然后在每次执行函数的范围内访问它,而不依赖于全局变量。

这似乎是原型属性(变量)的标准使用-但我能找到的JS原型的每个例子都是基于原型方法(函数)。关于在原型中设置属性/变量,我唯一能找到的是一个同样找不到这些信息的人的问题,他问这是好还是坏的做法(tldr:这很好,但记住,为了微小的性能提升而牺牲可读性是不值得的)。

我有一种方法来设置和获得原型属性的工作,但感觉笨拙,因为它取决于对函数的引用(本质上是var prop = thisfunctionname.prototype.someprop)。因为我发现它通过试验和错误,我想问是否有一个更干净,更标准的方式来获得这些原型属性从函数内部,不回到函数周围的作用域,并从那里得到函数?


这里有一个简单的轻松的例子:一个假想的jQuery插件,将一个数字与另一个数字相加,然后返回一个带有用户名的句子。我们希望只询问一次用户的名称,然后将该名称存储在作用域内供重用:

(function($) {
  var sum = function( num1,num2 ) {
    var result = num1 + num2;
    // This works, but seems clunky since it depends on the variable `sum` 
    // from the scope around this function - is there a better way?
    var name = sum.prototype.name;
    $(this).text( num1+' plus '+num2+' is '+result+', '+name+'.');
    return $(this);
  };
  var name = prompt('Please enter your name','');
  // Is there a better way to set this default variable to be accessible 
  // in all calls to this function?
  sum.prototype.name = name;
  $.fn.basicArithmetic = sum;
})(jQuery); 
// end of plugin. Example usage...
$('<p/>').basicArithmetic(1,5).appendTo('body');
$('<p/>').basicArithmetic(2,2).appendTo('body');
$('<p/>').basicArithmetic(25,30).appendTo('body');
$('<p/>').basicArithmetic(92.3,15.17).appendTo('body');

Live jsbin示例。更现实的实际用例是,当属性的计算在内存使用方面很昂贵,或者具有破坏性(例如,需要在计算期间更改DOM)时。

两个不同的答案,真的:

  1. 通常的方法是在一个作用域函数中使用一个变量(在你的例子中已经有一个);没有原型。

    (function($) {
      var name;
      name = prompt('Please enter your name','');
      function sum( num1,num2 ) {
        var result = num1 + num2;
        $(this).text( num1+' plus '+num2+' is '+result+', '+name+'.');
        return $(this);
      }
      $.fn.basicArithmetic = sum;
    })(jQuery); 
    

    更新JSBin示例| Source

    (旁注:我还将匿名函数表达式更改为命名函数声明,但在这种情况下并不重要)

  2. jQuery插件中的常用方法是将数据存储在应用插件的元素上。这不适用于您给出的示例,它要求数据对插件是全局的,但通常(并非总是,只是通常)插件只保留特定于实例的信息,这些信息通常存储在元素中(可能通过data函数)。