Я думаю, что неправильно понял, как работает прототипное наследование Javascript. В частности, внутренние переменные прототипов, по-видимому, разделяются между несколькими различными под-объектами. Проще всего проиллюстрировать код:
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());
Это выводит 1 - 2
(проверьте его на JSBin), в то время как я полностью ожидал, что результат будет 1 - 1
, так как я хотел два отдельных объекта.
Как я могу убедиться, что объект A
не является общим объектом между несколькими экземплярами B
?
Обновление: В этой статье освещаются некоторые проблемы:
Проблема заключается в том, что область применения каждого подхода для создания частной переменной, которая отлично работает, также является закрытием в действии, результатом чего является изменение частной переменной для одного экземпляра объекта, она изменяется для всех, То есть его больше похоже на частное статическое свойство, чем фактическая личная переменная.
Итак, если вы хотите иметь что-то личное, больше как непубличную константу, любой из вышеперечисленных подходов хорош, но не для реальных частных переменных. Частные переменные работают очень хорошо с объектами singleton в JavaScript.
Решение. В соответствии с ответом BGerrissen изменение объявления B
и уход прототипа работают по назначению:
var B = function() { A.apply(this, arguments); };