Я думаю, что не понял, как работает прототипное наследование 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
?
Update: This article подчеркивает некоторые из вопросов:
Проблема заключается в том, что сфера каждый подход использует для создания частной переменной, которая работает хорошо, также замыкание, в действии, что результаты in, если вы меняете приватную переменную для экземпляра одного объекта, она изменяется для всех. То есть это больше похоже на частное статическое свойство, чем фактическая личная переменная.
Итак, если вы хотите, чтобы что-то личное, больше как непубличная константа, любой из приведенных выше подходов хорош, но не для реальных частных переменных. Частные переменные работают очень хорошо с объектами singleton в JavaScript.
Решение: В соответствии с ответом BGerrissen, пеленальным декларацию о B
и выходе прототипа работает как задумано:
var B = function() { A.apply(this, arguments); };
Но здесь все дело в том, что функциональность принадлежит в 'Ā', и распределяется между несколькими суб«классов»(' 'b', C' и 'D'). Нет ли возможности для нестатических частных переменных в суперклассах в Javascript? –
Обычный способ обозначения «личных» намерений (иначе говоря, программисты что-то особенное происходит со свойством) - использовать символ подчеркивания как префикс имени свойства (т.е. obj._privateMember). Хотя это будет работать с наследованием для строк и чисел, оно начинает становиться более сложным при использовании объектов и массивов в качестве свойств. – BGerrissen
Я не совсем понимаю, что вы просите. Вы хотите, чтобы переменная, определенная в функции 'A', была доступна для методов' B', 'C' и' D', но больше нигде? Постарайтесь не думать о вещах в JavaScript с точки зрения возможностей других языков (таких как Java или C#). JavaScript просто не имеет классов. Он имеет объекты, которые наследуют свойства от других объектов через цепочку прототипов. –