Getter和setter就像一个闭包中的行为一样

时间:2017-08-03 12:37:27

标签: javascript

学习javascript,我正在尝试编写一个简单的闭包,它封装了一个我可以设置或获取的变量。 以下是我专门针对的行为示例:

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?
}

我的问题根据最后的代码注释,我如何返回这个确切的Field实例?

1 个答案:

答案 0 :(得分: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());