这是代码,我一直在努力工作几个小时,想法是跟踪创建的实例数,但也可以调用静态方法和更改/更新静态成员。有类似的问题,但我无法解决我的问题。
// object constructor
function Foo() {
this.publicProperty = "This is public property";
}
// static property
Foo.staticProperty = "This is static property";
// static method
Foo.returnFooStaticProperty = function() {
return Foo.staticProperty;
};
console.log("Static member on class: " + Foo.staticProperty); // This is static property
console.log("Result of static method: " + Foo.returnFooStaticProperty()); //This is static property
var myFoo = new Foo();
console.log("myFoo static property is: " + myFoo.staticProperty); // undefined
为简单起见,我在这里更改了构造函数和成员名称。我认为发生的事情很明显。我希望构造函数对象和实例共享相同的静态属性。
我可以在构造函数对象上访问静态成员,但是在实例上我得到了未定义。
答案 0 :(得分:7)
您可以尝试通过构造函数
访问静态属性console.log(myFoo.constructor.staticProperty);
答案 1 :(得分:7)
编辑:我重新阅读了您的问题,此代码解决了您所说的实际问题:
JavaScript的:
function Foo() {
this.publicProperty = "This is public property";
Object.getPrototypeOf(this).count++;
}
Foo.prototype.count = 0;
console.log(new Foo().count, new Foo().count, Foo.prototype.count);
虽然如果对象被释放用于垃圾收集,但这并不会自动递减计数,但您可以使用 delete 然后手动递减。
答案 2 :(得分:2)
Javascript是基于原型的。换句话说,对象的所有实例共享相同的原型。然后,您可以使用此原型来放置静态共享属性:
function Foo() {
this.publicProperty = "This is public property";
}
Foo.prototype.staticProperty = "This is static property";
var myFoo = new Foo();
console.log(myFoo.staticProperty); // 'This is static property'
Foo.prototype.staticProperty = "This has changed now";
console.log(myFoo.staticProperty); // 'This has changed now'