2015-10-15 5 views
0

Я застрял с шаблоном проектирования в JavaScript, где я хотел бы создать приватную статическую переменную-член для хранения объекта. Что-то вдоль этих линий:Объявление частной статической переменной-члена в JavaScript

var person = function(name){ 
    //How to persist this value across multiple calls avoiding Globals 
    var _personCount = _personCount || 0; 
    _personCount++; 
    var _name = name; 
    getPerson = function(){ 
      return "Person is: " + _name; 
    } 
}; 

person("foo");//_personCount should be 1 after this call 
person("bar");//_personCount should be 2 after this call 

Идея что-то похоже на частные статические переменные, доступные только для внутренних переменных в классе в

+0

Во-первых, использовать реальный объект, а не просто вызов функции без 'new'. Эти переменные являются локальными для функции и не живут за вызовом функции. –

ответ

4

Вы можете использовать revealing module pattern:

var something = (function() { 
    var myThing = 0; 

    return { 
    doSomething: function() { 
     myThing++; 
    } 
    }; 
})(); 

something.doSomething(); // myThing is now 1 

переменная находится в пределах того, что называется IIFE (сразу вызывается функция выражения) будет сохраняться на протяжении всего жизненного цикла программы.

Если вы собираетесь создавать экземпляр модуля несколько раз в разных местах, вам также необходимо создать singleton.

+0

Большое спасибо за то, что это ясно. Я думаю, моя проблема была ближе к одноэлементному шаблону –

2

Если вы хотите, чтобы переменная должна быть глобальной для всех лиц, вам необходимо определите их в рамках содержащейся функции. Это может быть IIFE, так как он должен запускаться только один раз.

var person = (function() { 
    var _personCount = _perconCount || 0; 
    return function(name) { 
     _personCount++; 
     var _name = name; 
     getPerson = function() { 
      return "Person is: " + _name; 
     }; 
    }; 
})(); 
2

Вы должны создать приватную статическую переменную в контексте закрытия.

var person = (function() { 
    //private variable 
    var _personCount = 1; 

    return function(name) { 
     this.name = name; 
     this.id = _personCount++; 
    } 

}()); 

var foo = new person('foo'); 
console.log(foo.id + ' ' + foo.name);//1 foo 

var boo = new person('boo'); 
console.log(boo.id + ' ' + boo.name);//2 boo 

Здесь включенная анонимная функция никогда не может быть вызвана снова. Он запускается, в то время как JS-движок анализирует ваш код и создает переменную _personCount, доступ к которой можно получить только по внутренней функции function(name), делая ее как private static.

1

Я думаю, что это может вам помочь! примечание: свойство прототипа для метода экземпляра! note: count, вместо этого, является статическим!

var Person = (function() { 
 
    var counter = 0; 
 
    function Person(name) { 
 
    this.name = name; 
 
    } 
 
    
 
    Person.prototype.getName = function() { 
 
    counter += 1; 
 
    return this.name; 
 
    }; 
 

 
    Person.count = function() { return counter; }; 
 
return Person; 
 
})(); 
 

 
var superman = new Person('SuperMan'); 
 
var batman = new Person('BatMan'); 
 

 
var el = function() { return window.document.getElementById('counter'); } 
 
function p1() { 
 
    var name = superman.getName(); 
 
    el().innerText = name + ' - ' + Person.count(); 
 
} 
 
function p2() { 
 
    var name = batman.getName(); 
 
    el().innerText = name + ' - ' + Person.count(); 
 
}
<h1 id="counter">0</h1> 
 

 
<button onclick="p1()">Person1</button> 
 
<button onclick="p2()">Person2</button>

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