我从here使用closure
找到了简单的解决方案@Xotic750
但是,没有括号就可以运行功能吗? E.G。:
var increment = new Increment()
console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3
每个函数运行时,我在[object Object]
中得到的{em> function 为console.log
而不是value
:
var Increment = (function(n) {
return function() {
n += 1;
return n;
}
}(0));
var increment = new Increment();
console.log('value: ' + increment) // value: [object Object]
console.log('value: ' + increment) // value: [object Object]
console.log('value: ' + increment) // value: [object Object]
答案 0 :(得分:2)
在打印increment
实例时,发生toString
转换。您可以使用它来执行递增操作:
var Increment = (function(n) {
var f = function() {}; // Only serves as constructor
f.prototype.toString = function() {
n += 1;
return n;
}
return f
}(0));
var increment = new Increment();
console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3
请注意,计数器有点像全局计数器。如果希望计数器分开并为每个实例从0重新开始,则使用this
:
var Increment = (function(n) {
var f = function() {
this.n = 0;
};
f.prototype.toString = function() {
this.n += 1;
return this.n;
}
return f
}(0));
var increment = new Increment();
console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3
increment = new Increment();
console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3
答案 1 :(得分:1)
您正在通过使用Increment
关键字来创建函数new
的对象。就您而言,您只想这样调用Increment
函数:
console.log('value: ' + Increment());
console.log('value: ' + Increment());
console.log('value: ' + Increment());
请参见Closures上的此链接,以获取有关其工作方式的更详细说明。
答案 2 :(得分:1)
是否可以在没有圆括号的情况下运行功能
是的,您可以使用getter进行操作,下面是一个示例:
class Cls {
constructor() {
this.value = 0;
}
get increment() {
return this.value++
}
}
const cls = new Cls()
console.log('value: ' + cls.increment)
console.log('value: ' + cls.increment)
console.log('value: ' + cls.increment)