Javascript类中的静态变量

问题描述 投票:7回答:2

是否有正确种方法来创建private静态javascript变量(和函数),无论您创建new Obj多少次,它们都不会改变?

这是我尝试过的,似乎是[[工作:

var ObjClass = (function(){ var static_var = 0; //private static variable var static_fn = function(){ return static_var; }; //private static function return function(){ ++static_var; var thisNumber = static_var; this.getThisNumber = function(){ return thisNumber; } this.getStaticNumber = static_fn; //making static fn public } })(); var obj1 = new ObjClass; var obj2 = new ObjClass; var obj3 = new ObjClass; console.log(obj1.getThisNumber()); //output `1` console.log(obj1.getStaticNumber()); //output `3` console.log(obj2.getThisNumber()); //output `2` console.log(obj2.getStaticNumber()); //output `3` console.log(obj3.getThisNumber()); //output `3` console.log(obj3.getStaticNumber()); //output `3`​
DEMO

或者有没有

其他

更好的方式?
javascript object static-methods static-members
2个回答
6
投票
是,这是创建私有静态变量的正确方法。

但是,我将static_fn视为不同。您似乎希望将其公开。

    它应该在您的“类”原型上,因为它不会与私有实例变量交互
  1. 它甚至根本不与实例交互。通常的方法是将此类函数/变量放在“类”本身上,即JS中的构造函数。由于构造函数是Function对象,因此可以像其他js对象一样使用属性进行扩展。
  • var ObjClass = (function closure(){ var static_var = 0; //static private (scoped) variable function static_fn(){ return static_var; }; //static private (scoped) function function ObjClass() { var thisNumber = ++static_var; // private instance variable this.getThisNumber = function() { // public instance method return thisNumber; // "privileged" to access scoped instance variables }; } ObjClass.getStaticNumber = static_fn; // make the static_fn public return ObjClass; })(); var obj1 = new ObjClass; var obj2 = new ObjClass; console.log(ObjClass.getStaticNumber()); //output `2` var obj3 = new ObjClass; console.log(ObjClass.getStaticNumber()); //output `3` console.log(obj1.getThisNumber()); //output `1` console.log(obj2.getThisNumber()); //output `2` console.log(obj3.getThisNumber()); //output `3`

  • 1
    投票
    我以前使用这种简单的方法来创建静态变量,但它们是私有的。

    function MyClass() { var static = this.constructor.static = this.constructor.static || { var1: defValue, ... } static.var1 = ... ; }

    即只需将静态变量存储为类的主要构造函数的属性即可。
    © www.soinside.com 2019 - 2024. All rights reserved.