2017-08-03 59 views
0

學習JavaScript,我想寫一個簡單的封閉,封裝一個變量,我可以設置或獲取。 這裏是行爲我的目標進行具體的例子:Getter和setter像一個封閉的行爲

let x = Field(1) //set value to 1, return the closure itself 
x(2)    //set value field to 2 
x()    //returns 2 
x(3)    //set value to 3 
x()    //returns 3 

是有可能做上述保留相同的確切的語法,我想到的是我應該做的閉包返回本身,而是當我試過了這顯然失去了價值領域,創造了一個新的實例:

/** 
* if v is passed it functions like a setter 
* if no arguments passed it functions like a getter 
* @param {*} [v] 
*/ 
const Field = function(v){ 
    let value 
    if (arguments.length === 1) { //SET 
     value = v; 

    } else if (arguments.length === 0) { //GET 
     return value; 
    } else { 
     throw 'Field can have one or no arg' 
    } 

    return Field //how to i return this exact instance of Field? 
} 

我按照過去的代碼註釋的問題,我怎麼回場的這個確切的實例?

回答

1

這樣的事情?

const Field = function(v) { 
 
    this.value = v; 
 

 
    return function() { 
 
     if (arguments.length === 1) { //SET 
 
      this.value = arguments[0]; 
 
     } else if (arguments.length === 0) { //GET 
 
      return this.value; 
 
     } else { 
 
      throw 'Field can have one or no arg' 
 
     } 
 
    }.bind(this); 
 
} 
 

 
let f = new Field(42); 
 
console.log(f()); 
 

 
f(51); 
 
console.log(f());