学习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实例?
答案 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());