操作闭包中定义的变量
Manipulate variable defined in closure
假设我有一个定义并实例化的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; }
}
}
相关文章:
- 得到"全局未定义“;全局变量定义清楚时出错
- 使用变量的名称,然后为该变量定义函数
- Javascript 从 php 变量定义 getElementById()
- 使用变量定义宽度和高度
- 函数内部的JavaScript全局变量定义
- Javascript变量定义-澄清
- 为多个变量定义相同的类型,在Webstorm中识别
- 如何用变量定义一个数组,然后用一个数字填充每个数组
- 画布的奇怪行为 上下文变量定义位置导致选项卡处于非活动状态时画布呈现冻结
- 为什么要显式将变量定义为未定义
- Gulp/Grunt 获取触笔工作表中的所有颜色变量,并将它们作为变量定义写入文件
- 是否可以在 Node.js 中为模块变量定义 SET 函数
- ES6 块范围的变量定义作为条件
- 使用 jQuery 获取由变量定义的文本输入的值
- :gt()选择器,为变量定义的索引
- 如何在ASP.NET中将Javascript变量定义为Session
- 带有用户输入的ajax请求变量定义有问题
- 使用ElasticSearch搜索变量定义字段
- 变量定义,不同的输出
- JavaScript变量定义和范围