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

时间:2013-03-05 12:21:13

标签: javascript scope prototype

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

这似乎是原型属性(变量)的标准用法 - 但我在JS原型上找到的每个例子都基于原型方法(函数)。关于在原型is a question from someone who also couldn't find any information about these, asking if it's good or bad practice中设置属性/变量我唯一能找到的东西(tldr:很好,但是记住它很少值得牺牲可读性以获得微小的性能提升)。

我有办法设置和获取有效的原型属性,但感觉笨重,因为它依赖于对函数的引用(实质上是var prop = thisfunctionname.prototype.someprop)。自从我通过反复试验找到它之后,我想问一下是否有更简洁,更标准的方法从函数中获取这些原型属性,而不是回到函数的范围并从那里获取函数?


这是一个简化的轻松示例:虚构的jQuery plugin that adds a number to another number然后将其返回到具有用户名称的句子中。我们只想询问用户他们的名字一次,然后将该名称存储在范围内重复使用:

(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 example.更真实的实际用例是当属性的计算在内存使用中是昂贵的,或者是破坏性的(例如,在计算期间需要更改DOM)。

1 个答案:

答案 0 :(得分:1)

两个不同的答案,真的:

  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); 
    

    Updated JSBin Example | Source

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

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