Что-то смущает наследование прототипов Javascript. Позвольте мне объяснить.
Поля, определенные в объекте-прототипе, совместно используются всеми экземплярами . Проблема в том, что вы не можете заметить это, потому что присваивание в поле объекта o всегда выполняется в экземпляре o, а не в прототипе.
Таким образом, у вас есть два варианта определения статических полей.
(1) Определить поле в объекте-прототипе. Если вы хотите изменить его, вы должны изменить его через объект-прототип и.
function Calendar() {
}
Calendar.prototype = {
constructor: Calendar,
y: 'y',
};
function go()
{
var c1 = new Calendar();
var c2 = new Calendar();
alert("c1.y=" + c1.y + " c2.y=" + c2.y);
// now setting y to 'YYYYY';
Calendar.prototype.y = 'YYYYY';
// both c1 and c2 'see' the new y value
alert("c1.y=" + c1.y + " c2.y=" + c2.y);
}
Опасность этого заключается в том, что вы можете случайно попытаться установить поле y с помощью одного из экземпляров, например: c1.y = 5555, и в этом случае присваивание будет выполняться для объекта c1, но не для объекта c2 .
Следовательно, вы можете использовать второй вариант, который безопаснее, но требует еще нескольких нажатий клавиш ...
(2) Используйте трюк инкапсуляции Javascript, чтобы убедиться, что поле прототипа доступно только с помощью методов получения и установки.
function Calendar() {
}
function initCalendarPrototype()
{
var y = 'y';
Calendar.prototype = {
constructor: Calendar,
getY: function() { return y; },
setY: function(arg) { y = arg; },
};
}
function go()
{
initCalendarPrototype();
alert("c1.getY()=" + c1.getY() + " c2.getY()=" + c2.getY());
// now setting y to 'YYYYY' via setY()
// Can be invoked on either c1, c2 or Calendar.prototype
c1.setY('YYYYY')
// both c1 and c2 'see' the new y value
alert("c1.getY()=" + c1.getY() + " c2.getY()=" + c2.getY());
}