假设我有一个定义和实例化的JavaScript类,如下:
Demo = function() {
var abc = "foo";
return {
get test() { return abc; }
}
}
obj = Demo();
obj.test // evaluates to "foo"
仅仅面对这个演示实例obj
,我能否改变属于这个对象的变量abc
的值,该变量是在构造函数引入的闭包中定义的?
假设我有一个定义和实例化的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");
不是。这是闭包的基本用途之一——定义私有、无法访问的变量。它们可以被检索,但除非有一个“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';
在“构造函数”内定义的这些类型的函数被称为特权函数。它们可以访问公共变量(即在原型上定义的变量)和私有变量。阅读this以了解“类”的公共/私有/特权成员的详细信息。
请注意,如果您只是执行以下操作:
var d = Demo();
你并没有得到 Demo 的实例,你只是得到了它返回的内容。在我的情况下是 undefined
。
再次阅读您的帖子后,快速答案就是不行,至少不是使用您特定的定义方式,您需要做类似于我所做的事情。
或者,如果您坚持使用您的范例:
function Demo(){
var abc = "some value";
return {
get test(){ return abc; },
set test(val){ abc = val; }
}
}
{ ... }
创建一个对象,而get test() { }
定义了一个属性。因此,Demo函数构造并返回一个具有属性test
的对象。 - Niklas B.
abc
成为“私有”变量。请参阅此线程https://dev59.com/plrUa4cB1Zd3GeqPmbjp以进行进一步讨论,但是私有就是私有。它在不更改类的情况下在该范围之外是不可用的。 - jfriend00private
属性就不再是私有的了。如果你不想它们是私有的,可以使对象拥有公共属性,在函数的范围之外能够自由读取或赋值。但是这样做需要修改类并重新定义abc
。 - jfriend00env.js
文件中的window.location
对象。我希望这可以在不修改库代码的情况下实现,但似乎宇宙与我作对。 - Niklas B.