在javascript中初始化对象时的一些问题

时间:2017-07-19 20:37:14

标签: javascript

<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.原因是什么以及如何修改代码以获得预期值

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

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:1)

javascript(以及所有其他语言)中的

变量只是保存值的内存槽。 (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设置为结果。以上并不常见或标准。我绝对会避免它。大多数编程语言都没有这样的功能,这违背了良好的设计实践。显式函数调用是在运行时检索动态表达式值的正确方法。