y 在您设置 z 时进行评估。那时 y 为 6,因此 z 为 7。当您增加 y 时,不会重新评估 z(正如您所发现的那样)。
y=1;
z=++y;//increment y and assign the value to z
// z will be 2;
z=y++;//set z to the value of y and then increment y
// z is now 2 and y is 3
如果您希望一个变量依赖于另一个变量的值,您不能只为它们分配新值。您必须使用 getter 和 setter 函数:
var myObj={
y:0,
x:0,
setY:function (value){
this.y=value;
this.x=value+1;
},
setX:function (value){
this.x=value;
this.y=value-1;
}
}
myObj.setY(4);
console.log(myObj.x);//=5
myObj.y=2;//breaks setting x, you have to use setters
console.log(myObj.x);//=5
如您所见,myObj.y=2
换行符设置 z 因此您无法在不中断的情况下将值分配给 myObj.y 或 myObj.z。
为防止这种情况发生,您必须将 x 和 y 设为私有。在 JavaScript 中,您可以使用闭包来模拟私有变量。
对以下代码的警告:如果您计划创建对象的多个实例,请使用构造函数并使用代码约定(如_privateVar
)而不是真正的隐私来使用私有变量,因为 JS 不支持它,除非您打算不使用原型.
var myObj=(function(){
var x=0;// x and y only exist in the funciton body
var y=0;// you cannot access them in myObj.x or .y
return{
setX:function(value){
//maybe check if value is a number here
x=value;
y=value-1;
},
setY:function(value){
//maybe check if value is a number here
y=value;
x=value+1;
},
getX:function(){
return x;
},
getY:function(){
return y;
}
}
})();
myObj.setX(6);
console.log(myObj.getY());//logs 5
myObj.y=22;
console.log(myObj.getY());//still logs 5
使用带有 get 和 set 的 bfavaretto 语法,您可以分配新值,但在内部 JavaScript 将使用 getter 和 setter 函数。这在 IE8 及以下的旧浏览器中不起作用。
var myObj={
_y:0,
_x:0,
set y(value){
this._y=value;
this._x=value+1;
},
get y(){
return this._y;
},
set x(value){
this._x=value;
this._y=value-1;
},
get x(){
return this._x
}
}
myObj.x=4;
console.log(myObj.y);//=3