Как объявить статическую переменную в 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;
Ответы
Ответ 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);