如何访问实例上的静态成员?

Ala*_*Kis 8 javascript oop static-methods static-members

这是代码,我一直在努力工作几个小时,想法是跟踪创建了多少实例,但也可以调用静态方法和更改/更新静态成员.有类似的问题,但我无法解决我的问题.

  // 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
Run Code Online (Sandbox Code Playgroud)

为简单起见,我在这里更改了构造函数和成员名称.我认为发生的事情很明显.我希望构造函数对象和实例共享相同的静态属性.

我可以在构造函数对象上访问静态成员,但在实例上我得到了undefined.

小智 7

您可以尝试通过构造函数访问静态属性

console.log(myFoo.constructor.staticProperty);
Run Code Online (Sandbox Code Playgroud)

  • 这种情况到底发生了什么?我是否指出 myFoo 的构造函数是 Foo,因为静态属性绑定到构造函数 Foo ? (2认同)

Xit*_*ogy 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);
Run Code Online (Sandbox Code Playgroud)

小提琴

虽然如果对象被释放用于垃圾收集,但这并不会自动减少计数,但您可以使用delete然后手动递减.