2017-08-03 14 views
0

JavaScriptを学んで、私は設定または取得できる変数をカプセル化する単純なクロージャを作成しようとしています。ここ iは、具体的を目指しています行動の例です。1つのクロージャーでゲッターとセッターのような振る舞い

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

関連する問題