0

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

这似乎是原型属性(变量)的标准用法——但我能在 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');

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

4

1 回答 1

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

    更新 JSBin 示例| 来源

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

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

于 2013-03-05T12:29:36.483 回答