Подтвердить что ты не робот

Как объявить статическую переменную в Javascript

В следующем коде я хотел бы иметь счетчик, чтобы отслеживать количество созданных объектов Person. Этот код не делает этого, как бы я это сделал?

function Person(){
    this.name = "Peter";
    this.counter = this.counter + 1;
    alert(this.counter);
}

Person.prototype.counter = 0;

var p1 = new Person;
var p2 = new Person;
4b9b3361

Ответ 1

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}

Person.counter = 0;

var p1 = new Person();
var p2 = new Person();

Сделайте "статическую" переменную свойством функции Person, а не prototype, и используйте Person вместо this внутри конструктора.

Это возможно, потому что функции JavaScript являются первоклассными (т.е. являются объектами), поэтому могут иметь собственные свойства.

Здесь рабочий пример указанного кода.

Ответ 2

Вы также можете сделать свою переменную-счетчик "private", объявив ее локальной для закрытия. Это лучший способ иметь нечто похожее на частные - статические переменные:

var Person = (function() {

    var counter = 0;

    return function() {
        counter++;
        this.name = "Peter";
        alert(counter);
    }
})();


var p1 = new Person();
var p2 = new Person();

Ответ 3

Нет статических свойств. Если вы хотите сохранить данные в функции Person.

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}

Ответ 4

Для статики вы можете назначить свойство самому объекту функции;

Person.counter = 0;

И внутри инкремента конструктора с;

Person.counter += 1;

Вы также можете проверить-if- undefined и создать Person.counter внутри конструктора

function Person(){
   if (typeof Person.counter === 'undefined')
      Person.counter = 0;
   else
      Person.counter += 1;
   ...

Ответ 5

В js нет таких вещей, как статические переменные/свойства класса. Самый простой подход - использовать функцию класса только как пространство имен для статических переменных.

Это означает, что просто доступ к Person.count напрямую.

Вы также можете использовать закрытие, но на самом деле в 90% случаев это будет излишним. В современных браузерах вы также можете переопределить функцию getter/setter, чтобы обернуть использование Person.count и других "статических" переменных.

Этот фрагмент демонстрирует идею:

    function borrow(obj, borrowobj, fname) {
    obj.__defineGetter__(fname, function() {
         return borrowobj[fname]   
    })  

    obj.__defineSetter__(fname, function(val) {
             borrowobj[fname] = val      
    })
}

function Person() {
    borrow(this, Person, "count");
    this.count++
}

Person.count = 0;

new Person();
new Person();
var p = new Person();
alert(p.count);