<script type="text/javascript">
function A(){
this.a = 0;
this.b = 0;
this.c = (this.a + this.b) ;
}
var ia = new A();
ia.a = 1;
ia.b = 2;
alert(ia.c);
</script>
以上是我的代码。当我运行代码时,ia.c的结果为零,但我认为它应该是3.原因是什么以及如何修改代码以获得预期值
答案 0 :(得分:1)
https://jsfiddle.net/79ccycuk/
因为在构造函数运行时计算this.a + this.b
。
您需要将c创建为函数并调用它以使其重新计算正确的值。
function A() {
this.a = 0;
this.b = 0;
this.c = function() {
return this.a + this.b;
};
}
let ia = new A();
ia.a = 1;
ia.b = 2;
alert(
ia.c()
);
答案 1 :(得分:1)
您正在使用this.c
的结果立即设置this.a + this.b
。如果您想要返回总和,那么您可以使用Javascript的getter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get
var A = function () {
return {
a: 0,
b: 0,
get c() {
return this.a + this.b;
}
}
};
var x = new A()
var elm = document.getElementById('test');
x.a = 10;
x.b = 5;
elm.innerText = x.c;
&#13;
<h1 id="test"></h1>
&#13;
答案 2 :(得分:1)
变量只是保存值的内存槽。 (a + b)
是一个右手表达式,经过评估,然后this.c
被设置为运行时其结果的值。一旦完成该代码行的执行,唯一剩下的就是具有单个整数值的变量c
。即使你写了这样的东西:
var x = 1;
var y = x;
y只会在声明发生时设置为x的值。现在您可以将x设置为您想要的任何值,y将保持为1,直到您明确更改它为止。如果你考虑一下,这在大多数情况下都是有道理的。但是,在某些情况下,您实际上希望c表示动态表达式,在这种情况下,您可以使用function
作为已描述的人:
A.prototype.c = function(){
return this.a + this.b;
};
现在,如果您致电ia.c()
,它将在进行函数调用时返回ia.a + ia.b
的值。
也许你正在寻找更有趣的东西,并且你不想使用函数调用语法,在这种情况下你可以使用javascript getters / setters:
this.c = {
get:function(){
return this.a + this.b;
}
}
现在,只要在表达式中使用this.c
,就会调用此函数,并将this.c
设置为结果。以上并不常见或标准。我绝对会避免它。大多数编程语言都没有这样的功能,这违背了良好的设计实践。显式函数调用是在运行时检索动态表达式值的正确方法。