处理闭包中定义的变量

时间:2011-09-06 21:15:23

标签: javascript closures

假设我定义了一个Javascript类并实例化如下:

Demo = function() { 
  var abc = "foo";

  return {
    get test() { return abc; }
  }
}

obj = Demo();
obj.test  // evaluates to "foo"

使用此演示实例obj仅面对 ,我是否可以更改属于此对象的变量abc的值,该值在构造函数引入的闭包中定义功能

3 个答案:

答案 0 :(得分:3)

var abc不能在演示范围之外直接使用。

如果要从该范围外更改它,则必须添加一个方法来设置它。

Demo = function() { 
  var abc = "foo";

  return {
    get test() { return abc; }
  }

  this.setTest(a) {abc = a;}
}

var obj = new Demo();
obj.setTest("fun");

有关您可以使用的访问者类型的示例,请参阅this previous discussion

答案 1 :(得分:2)

没有。这是闭包的基本用途之一 - 定义私有的,不可访问的变量。可以检索它们,但除非有“setter”功能,否则无法修改它们。

答案 2 :(得分:0)

我觉得你在这里有点困惑。如果您像类一样使用Demo,则不希望像函数一样调用它,而是像实例化一样。

当与实例化一起使用时,你绝对可以这样做:

function Demo(){
  var abc = "some value";

  this.setAbc = function(val){
    return abc = val;
  }

  this.getAbc = function(){
    return abc;
  }
}

var d = new Demo();
d.getAbc()   // => 'some value';
d.setAbc('another value');
d.getAbc()   // => 'another value';

这些类型的函数(在“构造函数”中定义)称为特权函数。他们可以访问公共(即在原型上定义)和私有变量。阅读this,了解“班级”的公共/私人/特权成员的良好纲要。

请注意,如果您这样做:

var d = Demo();

你没有得到Demo的实例,你只是得到它返回的东西。就我而言undefined

修改

再次阅读你的帖子之后,快速回答是否定的,不是你的特定定义,你必须做我正在做的事情。

或者如果你坚持你的范例:

function Demo(){
  var abc = "some value";

  return {
    get test(){ return abc; },
    set test(val){ abc = val; }
  }
}