假设我定义了一个Javascript类并实例化如下:
Demo = function() {
var abc = "foo";
return {
get test() { return abc; }
}
}
obj = Demo();
obj.test // evaluates to "foo"
使用此演示实例obj
仅面对 ,我是否可以更改属于此对象的变量abc
的值,该值在构造函数引入的闭包中定义功能
答案 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; }
}
}