当从Object内部访问时,变量变为0
Variable becomes 0 when accessing from within Object
我已经创建了一个像这样的对象:
var Object = function() {
var value = 0;
function do() {
console.log(value);
}
return {
do : do,
value : value
}
};
exports.Object = Object;
我从这个对象的外部调用do
函数:
function call(object) {
console.log(object.value);
object.update();
}
我在玩家类之外将值设置为等于2.5。奇怪的是,当我执行代码时,控制台记录如下:
2.5
0
2.5
0
所以,似乎值是0从类内,但2.5当我从外部访问它。这里的问题是什么?
我的背景主要是Java,我对Javascript相当陌生,所以也许我错过了一些微不足道的东西。
您已经创建了一个闭包:您正在返回一个具有属性value
的对象,但是当您更改返回对象的value
属性时,闭包中的var value
不会更改。
换一种方式解释,当你说new Object
时,你会得到两个value
,一个作为对象的属性返回,另一个是隐藏在闭包中的var object
。
尝试以下操作:
var Object = function() {
this.value = 0;
function do() {
console.log(this.value);
}
return {
do : do
}
};
exports.Object = new Object;
另外:
var Object = function() {
var value = 0;
function do() {
console.log(value);
}
return {
do : do,
getValue : function(){ return value; },
setValue : function(val){ value = val; }
}
};
exports.Object = Object;
正如Josh所提到的,这是一个value
vs reference
的问题,通常通过返回一个对象(所以它是通过引用)或包括getValue
和setValue
这样的函数来解决。
getters
,如下所示:
var Object = function() {
var value = 0;
function _do() {
console.log(value);
}
function update(val) {
value = val * .5;
}
return {
do: _do,
update: update,
// Our fancy getter!
get value() {
return value;
}
}
};
exports.Object = Object;
此时,Object.value
的行为与getValue
相似。
因为今天是星期五,让我们疯狂地添加我们的setter
:
var Object = function() {
var value = 0;
function _do() {
console.log(value);
}
return {
do: _do,
// Our fancy getters/setters!
get value() {
return value;
},
set value(val) {
value = val * .5;
}
}
};
exports.Object = Object;
那么你在做这样的事情:
Object.value; // Returns 0
Object.value = 5;
Object.value; // Returns 2.5
Object.do(); // Logs 2.5
定义getter和setter
Getter/Setter兼容性
实际上,您的代码相当于
var Object = function() {
var value = 0;
function do() {
console.log(value);
}
var res= {
do : do,
value : value
}
return res;
};
exports.Object = Object;
功能do()
将不记录res.value
。相反,它记录了Object
函数的一个局部变量,这意味着你不能改变do
返回的值。
如果您想记录res.value
,可以尝试如下:
function do(){
console.log(this.value);
}
然而,我必须提到别的事情。如果value
是一个对象而不是文字。你可以很容易地访问它。当对象通过ref.
试试这个:
var Object = function() {
var value = [0];
function doSth() {
console.log(value[0]);
}
var res= {
do : doSth,
value : value
}
return res;
};
exports.Object = Object;
相关文章:
- 如何在jquery中为object键创建一个工作变量以避免额外的代码
- 访问带有变量的Object元素时出现问题
- 是否有类似Object.defineProperty的方法来定义变量
- 当chrome检查器为jQuery变量返回[object object]时,如何返回实际数据
- 检查Object.key()是否与变量匹配
- 使用XhrIo填充Object's变量
- jQuery从变量中获取NaN和[object object]
- 为什么 Object.create 使我的私有变量成为静态变量
- 在提供给 Object.asassign 的对象中使用变量作为键
- 变量未传递正确的值.listAdd 最终成为 “[object text] [object text]” javascr
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- 通过属性和包含变量将Object传递给指令
- 定义带有"{}object",意外TypeError的变量
- 在Javascript object/json中使用变量会产生编译错误
- 如何在使用Object.create时设置单独的私有变量
- Object.create()不能访问函数内部的变量
- 为什么没有在object方法中声明var的变量不会成为全局变量
- 当从Object内部访问时,变量变为0
- 使用JSON-Object调用函数,它包含一个函数.如何获得函数外的返回变量
- 将Object key设置为javascript中的变量