Javascript 操纵闭包中定义的变量

Javascript 操纵闭包中定义的变量,javascript,closures,Javascript,Closures,假设我有一个Javascript类,定义和实例化如下: Demo = function() { var abc = "foo"; return { get test() { return abc; } } } obj = Demo(); obj.test // evaluates to "foo" 只有面对这个演示实例,我才能更改属于这个对象的变量abc,它是由constructur函数引入的闭包中定义的?否。这是闭包的基本用途之一-定义私有的、不可访问的变量。可以

假设我有一个Javascript类,定义和实例化如下:

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

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

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

只有面对这个演示实例,我才能更改属于这个对象的变量
abc
,它是由constructur函数引入的闭包中定义的?

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

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

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

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

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

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

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

有关可以使用的访问器类型的示例,请参见。

我认为您在这里有点困惑。如果您像类一样使用
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();
你不会得到演示的实例,你只是得到它返回的结果。在我的例子中,
未定义

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

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

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

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

这很明显,但我不希望更改类。但是+1,因为我没有明确说明这一点,您的建议可能会对其他人有所帮助。您使用的设计模式使
abc
成为“私有”变量。请参阅此线程进行进一步讨论,但private是private。如果不更改类,它在该范围之外是不可用的。是的,我现在明白了。我只是认为可能会有一些技巧,比如当你想用Ruby或Python访问私有成员时(我从来没有参与过严肃的Javascripting:),唯一的技巧就是创建一个访问器方法。Private是私有的,直到您创建一个公开它的访问器方法。如果不希望它们是私有的,可以使对象具有公共属性,这些属性在函数范围之外可以自由读取或分配。但是,要做到这一点,您必须更改类并以不同的方式定义
abc
。谢谢。我会接受jfriend00的回答,只是因为它为可能更改类接口的其他用户提供了更多的帮助。它为我返回了一个对象,这是env.js如何定义Location类的,所以它可能是ECMAScript的一种形式,至少Rhino和V8(我使用的解释器)理解它. 在该上下文中,
{…}
创建一个对象,并定义一个属性。因此,演示函数构造并返回一个带有属性
test
的对象。啊,对不起,没有注意到返回对象的模式。同样,如果不修改“类”,就无法设置变量。我更新了答案以反映这一点。