Проще говоря: ECMAscript edition 3 не имеет возможности создавать «приватные» переменные, используя наследование прототипа или цепочку прототипов.
В ES5 немного по-другому. У вас есть такие методы, как .defineProperties()
help , которые могут «скрывать» свойства внутри объекта.
Но даже если вы, например, скрываете свойства от перечисления, он все равно сможет получить доступ к ним, если будет знать, что они доступны. Как вы упомянули, единственная реальная конфиденциальность в ECMAland - это закрытие. Проще говоря, используя метод-шаблон, вызывая функцию (-context), которая возвращает объект, который содержит методы в качестве свойств. Эти методы имеют доступ (поскольку его контекст закрывается над родительским контекстом) к объявленным переменным во внешней (родительской) области видимости. Никакой другой объект не может получить доступ к этим переменным после. Это выглядит так:
var Animal = function( args, priv, shared ) {
shared = shared || { };
shared.speed = 2;
shared.legs = 4;
shared.name = args.name || 'unknown';
priv = priv || {
run: function() {
console.log(shared.name, ' is running ', shared.speed, ' meters');
return this;
},
die: function() {
console.log(shared.name, ': wwuuaarhhhck.. aahahsd sd..aahsd.....');
return this;
}
};
return priv;
};
var Dog = function( args, priv, secret ) {
secret = secret || { };
priv = Animal( args, priv, secret ) || { };
priv.addSomeMethod = function() { };
return priv;
};
var bello = Dog({name: 'Bello'});
bello.die(); // "Bello: wwuuaarhhhck.. aahahsd sd..aahsd....."
Есть несколько замечательных шаблонов, которые расширяют эту идею, которые также предлагают наследование и разделяемые объекты + супер методы. Хорошим началом такого рода программирования по-прежнему остается Дуглас Крокфордс "Javascript: хорошие части".