2016-03-05 33 views
2

我很困惑ES6 getters和setter。你能解釋一下這裏發生了什麼,以及爲什麼我得到堆棧溢出。ES6 getter和setter怪異行爲

我對Node.js的V5.1.1運行此

'use strict'; 

class List { 
    constructor(next, val) { 
    this.next = next; 
    this.val = val; 
    } 

    set val(v) { 
    this.val = v; 
    } 

    get val() { 
    return this.name; 
    } 
} 


let res = new List(null, 1); 
res.val = 3; 
console.log(res); 

下面是輸出:

/Users/o/code/test/test.js:9 
set val(v) { 
    ^

RangeError: Maximum call stack size exceeded 
+0

是的,謝謝你!現在我明白了。 – walkthroughthecode

回答

4

您在VAL二傳手,這是造成無限遞歸重新設定this.val通過再次調用setter,只需將this.val替換爲this._val即可。這將解決問題:)

class List { 
    constructor(next, val) { 
    this.next = next; 
    this._val = val; 
    } 

    set val(v) { 
    this._val = v; 
    } 

    get val() { 
    return this.name; 
    } 
} 
+0

我認爲這個值應該是私人的,否則在一個setter中沒什麼意義...... – dandavis

+0

好吧,還有一個例子,如果你想在設置一個公共屬性前進行一些計算,那麼可以使用setter。然而,你是對的,在大多數情況下應該使用私人財產。 –

+0

我在想,如果沒有傳入值的轉換,setter將被使用的唯一原因是創建一個只讀屬性,不會丟失嘗試集的跟蹤,但它的用例有限。 。 – dandavis