我正在尝试创建类似于静态语言“静态字段”的东西。基本上:每次调用init函数时,计数器属性都应该递增,但无论在哪个实例上都是如此。这是我用来测试的示例代码(http://jsfiddle.net/HK8BY/2/):
var Widget = {
counter: 0,
init: function () {
this.counter++;
console.log("init called: " + this.counter);
}
};
var t1 = Object.create(Widget);
var t2 = Object.create(Widget);
t1.init(); // should print: init called 1
t2.init(); // should print: init called 2
console.log(t1);
console.log(t2);
目前,当我调试console.log instanes时,我发现 proto 和实例都包含counter属性。我认为通过这种方法,只有原型才能拥有它。
那么如何将其更改为原型中只有计数器?
答案 0 :(得分:2)
var twitter = (function() {
var counter = 0;
return {
init : function() { counter++; console.log("init called: " + counter); }
};
}());
var t1 = Object.create(twitter);
var t2 = Object.create(twitter);
t1.init();
t2.init();
因此,您只需创建返回所需对象的IEFE(立即执行的函数表达式)。 counter
变量可用于该对象的init
函数的闭包。
答案 1 :(得分:0)
var Widget = {
init: function () {
this.prototype.counter++;
console.log("init called: " + this.counter);
}
};
Widget.prototype.counter = 0;
var t1 = Object.create(Widget);
var t2 = Object.create(Widget);
t1.init();
t2.init();
console.log(t1);
console.log(t2);
答案 2 :(得分:0)
您可以通过在构造函数上定义属性来模拟静态字段,但如果您希望使用Object.create
代替new
,那么这可能不是您想要考虑的解决方案。
function Widget() {
this.init()
};
Widget.counter = 0;
Widget.prototype.init = function() {
this.constructor.counter++;
console.log("init called: " + this.constructor.counter);
};