2017-07-19 64 views
0
<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,是什麼原因,我應該如何修改代碼以獲得預期值在javascript中初始化對象時出現的一些問題

+2

'c'的值在你的構造函數中設置,但是在構造函數運行後設置'a'和'b' *。 – Amy

回答

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() 
); 
+0

它確實有效! – Tim

+0

@Tim yep!請記住選擇一個答案,通過點擊答案 – zfrisch

+0

旁邊的綠色複選框來解決您的查詢問題。但是,我怎樣才能在之後修改c的值? – Tim

1

您正在使用的this.a + this.b結果立即設置this.c。如果你想返回的總和,那麼你可以使用JavaScript的getter在javascript 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;
<h1 id="test"></h1>

1

變量(和所有其他語言)是持有價值只是內存插槽。 (a + b)是一個右手錶達式,它被評估,然後this.c被設置爲運行時的結果值。一旦該代碼行的執行完成,唯一剩下的就是具有單個整數值的變量c。即使你寫這樣的東西:

var x = 1; 
var y = x; 

y只會被設置爲聲明發生時的值x。現在你可以將x設置爲任何你想要的,y將保持爲1,直到你明確地改變它爲止。如果你仔細想想,這在大多數情況下都是有意義的。然而,有這樣的情況,你會INFACT希望C到代表一個動態的表達,在這種情況下,你可以使用function如已經描述某人:

A.prototype.c = function(){ 
    return this.a + this.b; 
}; 
現在如果你調用 ia.c()

它將返回的ia.a + ia.b值在進行函數調用時。

也許你要的東西有點票友,而你不想使用函數調用語法,在這種情況下,你可以使用JavaScript getter/setter方法:

this.c = { 
    get:function(){ 
     return this.a + this.b; 
    } 
} 

現在,任何時候你在表達式中使用this.c,該函數將被調用,並且this.c將被設置爲結果。以上是不常見或標準的。我絕對會避免它。大多數編程語言都沒有這樣的功能,並且違背了良好的設計實踐。顯式函數調用是在運行時檢索動態表達式值的正確方法。