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

4

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

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

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

//Private static member?
4个回答

1
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返回完全相同的对象。它在构造函数中被调用(并创建一次)。该“静态对象”存储在一个私有实例变量中。因此,在一个实例中对该对象所做的任何更改都会影响到其他实例。触发器arguments.callee.caller == _class检查方法调用的来源,以避免公共访问。

0

static #myPrivateStaticMember = 1234;


0
我会使用这样的东西:
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;
}());

0
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)

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接