【问题标题】:How to create a private static variable?如何创建私有静态变量?
【发布时间】:2015-12-20 15:44:04
【问题描述】:

如何在Javascript中创建一个私有的静态变量?

var Class = function() {
    this.member = ...; //Public member
    var member = ...; //Private member
}

Class.member = ...; //Public static member

//Private static member?

【问题讨论】:

    标签: javascript variables static private


    【解决方案1】:

    我会用这个:

    var Class = (function() {
        function Class(){
            this.member = ...; // Public member
            var member = ...; // Private member
        }
    
        Class.member = ...; // Public static member
        var member = ...; // Private static member
    
        return Class;
    }());
    

    【讨论】:

      【解决方案2】:
      var MemberClass = function() {
          this.publicmember = 'Public Member'; //Public member
          var member = ''; //Private member
          MemberClass.staticVar = 'I am a static variable';
          this.priviledgedFunction = function() { // Private function
              member = 'I am a private variable';
              return member;
          }
      }
      

      现在访问每个成员:

      var obj = new MemberClass();
      console.log(obj.publicmember) // public member is directly accessible with obj
      console.log(MemberClass.staticVar) // To access the static variable
      

      不能直接访问私有成员,但您可以使用称为特权函数的东西访问它们。

      console.log(obj.priviledgedFunction)
      

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:
        function InitStatic(init)
        {
            var _class = this.constructor;
            _class._getStatic = function()
            {
                if(arguments.callee.caller == _class) { return init; }
            };
            return init;
        }
        
        function DemoClass()
        {
            var _class = this.constructor, _private = { }, _public = this;
            _private.Static = _class._getStatic ? _class._getStatic() : InitStatic.call(this, { Prop: "I am static.", Calls: 0 });
        
            _public.Method = function()
            {
                return ++_private.Static.Calls;
            };
        }
        var a = new DemoClass();
        var b = new DemoClass();
        console.log(a.Method()); // 1
        console.log(b.Method()); // 2 !!
        console.log(DemoClass._getStatic()); // undefined
        

        在这个解决方案中,DemoClass 的静态方法 _getStatic 结果与 object 完全相同。它在构造函数中被调用(并创建一次)。 “静态对象”存储在私有实例变量中。因此,在一个实例中对该对象的任何更改都会相互影响。触发器 arguments.callee.caller == _class 检查方法调用的来源,以避免公共访问。

        【讨论】:

          【解决方案4】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-14
            • 1970-01-01
            • 2011-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多