2015-09-23 3 views

ответ

0
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 

В этом решении статического метод _getStatic результатов DemoClass точно так же, объекта. Он вызывается (и создается один раз) в функции конструктора. «Статический объект» хранится в переменной частного экземпляра. Поэтому любые изменения этого объекта в одном экземпляре будут влиять друг на друга. Триггер arguments.callee.caller == _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) 

Надеюсь, это поможет!

Смежные вопросы