操作闭包中定义的变量

Manipulate variable defined in closure

本文关键字:变量 定义 闭包 操作      更新时间:2023-09-26

假设我有一个定义并实例化的Javascript类:

Demo = function() { 
  var abc = "foo";
  return {
    get test() { return abc; }
  }
}
obj = Demo();
obj.test  // evaluates to "foo"

面对只有这个演示实例obj,我可以改变属于这个对象的变量abc的值吗?这个变量是在构造函数引入的闭包中定义的。

var abc不能在Demo范围外直接使用。

如果你想在作用域之外改变它,你必须添加一个方法来设置它。

Demo = function() { 
  var abc = "foo";
  return {
    get test() { return abc; }
  }
  this.setTest(a) {abc = a;}
}
var obj = new Demo();
obj.setTest("fun");

请参阅前面的讨论,了解可以使用的访问器类型的示例。

No。这是闭包的基本用途之一——定义私有的、不可访问的变量。它们可以被检索,但是除非有一个"setter"函数,否则它们不能被修改。

我想你这里有点困惑。如果您像使用类一样使用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';

这些类型的函数(在构造函数中定义)被称为特权函数。他们可以同时接触到公众(即公众)。在原型上定义的)和私有变量。阅读这篇文章,你会得到一个关于"类"的公有/私有/特权成员的概要。

注意,如果你只做:

var d = Demo();

你没有得到Demo的实例,你只是得到它返回的东西。在我的例子中,undefined .

编辑

再次阅读你的帖子后,快速的答案是不,没有你的特定定义,你必须做一些像我正在做的事情。

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

function Demo(){
  var abc = "some value";
  return {
    get test(){ return abc; },
    set test(val){ abc = val; }
  }
}