【问题标题】:How to access static member on instance?如何访问实例上的静态成员?
【发布时间】:2013-10-28 12:44:19
【问题描述】:

这是代码,我已经为此苦苦挣扎了好几个小时,想法是跟踪创建了多少实例,但也可以调用静态方法和更改/更新静态成员。有类似的问题,但我无法解决我的问题。

  // 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

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

我可以访问构造函数对象上的静态成员,但在实例上我没有定义。

【问题讨论】:

    标签: javascript oop static-methods static-members


    【解决方案1】:

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

    console.log(myFoo.constructor.staticProperty);
    

    【讨论】:

    • 在这种情况下到底发生了什么?我是否指出 myFoo 的构造函数是 Foo,因为静态属性绑定到构造函数 Foo?
    • 使用new ClassName().constructor.staticProperty
    • 不知道原题标题是否被编辑,但这是唯一正确的答案如何从实例中获取静态成员值(即不知道类名)。跨度>
    【解决方案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'
    

    【讨论】:

    • 但在这种情况下,Foo() 对象构造会释放该静态成员。
    • @AlanKis,它没有。您可以随时使用this.prototype.staticProperty 引用它。
    【解决方案3】:

    编辑:我重新阅读了您的问题,此代码解决了您的实际问题,如所述:

    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 然后手动减少。

    【讨论】:

    • 是的,我现在已经看到了。重点是我在对象构造函数和它的实例之间共享相同的变量,但也能够运行静态方法,或者对象构造函数上的方法。并且在您的最终日志中,实例上的 staticProperty 调用未定义。
    • 我展示了 myFoo.staticProperty 在日志中未定义的目的是为了说明没有像 myFoo.returnFooStaticProperty() 这样的“kludge”函数我认为您不能从实例对象访问静态成员. “kludge”函数有效,但您能解释一下为什么要在类及其实例之间共享静态变量吗?也许重新考虑它与原型(和继承)一起工作的方式会有利可图?
    • 是的,正如我提到的原型方法有时会让我感到困惑。关键是静态成员在所有实例和类/构造函数本身之间共享,但它的值存储在一个地方,这意味着对象实例不继承该值。这就是原型出现的地方。您和 mors 答案的唯一区别是我需要在构造函数上调用方法。
    • @AlanKis 我重新阅读了你的问题,并意识到没有人真正解决你想要完成的事情。我相信我现在已经做到了。
    • 小提琴链接坏了。
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2021-08-19
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-09-19
    • 2012-12-17
    相关资源
    最近更新 更多