我可以向闭包添加方法吗?

时间:2010-09-28 16:54:55

标签: javascript closures

这是闭包意味着要避免的,但我想知道是否有办法向闭包添加方法。基本上我有一个js文件库,我想通过添加一个新方法来增加特定客户端。

我有一个名为library的js文件:

var LIBRARY = (function(){
var name;
return {
setName: function(n) { name = n; }
}());

但是对于一个新的客户端,我想给他们一个新的js文件,它只会增加LIBRARY,添加一个新函数:

function(first, last){
name = first + " " + last;
}

我不想修改库js。有没有办法将此函数附加到LIBRARY,以便该函数具有对 name 变量的必要访问权限?

3 个答案:

答案 0 :(得分:1)

不,不幸的是,你不能 - 或者至少不能以合理的方式。只有该闭包中定义的函数才能访问该局部变量。

执行此操作的不合理方法是使用eval玩游戏,但我强烈反对。

您所能做的就是向LIBRARY添加不需要直接访问该变量的函数。

答案 1 :(得分:0)

不确定你是如何设想“追加”的,但这是有效的

// Base
var LIBRARY = (function(){
  var name;
  return {
      setName: function(n) { name = n; }
    , getName: function() { return name; }
  }
}());

// Extension
LIBRARY.setFullName = function( first, last )
{
  this.setName( first + " " + last );
}

// Test
LIBRARY.setFullName( 'Peter', 'Bailey' );
alert( LIBRARY.getName() );

答案 2 :(得分:0)

所以我只想留下一个关于我是如何实现这一目标的说明,因为它强调了一种不同的思考JS架构的方式。

如前所述,我希望能够使用特定于客户端的功能扩充我的库。我最终做的是修改我的库以阅读:

var LIBRARY = (function(){
 var name;
 var settings;
 return {
  init: function(options){ 
    jQuery.extend(settings, options); // just merges two objects together
   }
  setName: function(n) { name = n; }
  custom: function(){
    if (!settings.custom || typeof(settings.custom == 'function'))
      return;
    name = settings.custom.apply(this, arguments);
  }
 }());

然后客户端库使用如下函数扩充我的LIBRARY:

LIBRARY.init({ custom: function(first, last) {
 return first + " " + last;
} });

所以现在客户端代码可以调用:

LIBRARY.custom("static", "hippo");

name 将设置为“static hippo”