Когда вы проектируете свои объекты, вам нужно принять решение, чтобы начать. Вы заботитесь о том, чтобы выставить внутренности объекта внешнему миру?
Если вам все равно, вам действительно следует добавить все свои методы в прототип объекта и всю переменную экземпляра в this
в вашей функции-конструкторе. Такой подход может быть нежелательным в некоторых ситуациях. Вот тут-то и появляются привилегированные методы, а также использование замыканий для имитации приватных методов.
Когда вы создаете привилегированный метод, он имеет доступ к закрытым и открытым членам объекта, как вы заметили. Большая разница между созданием привилегированного метода и общедоступного метода в прототипе заключается в том, что привилегированный метод создается для каждого экземпляра объекта, тогда как общедоступный метод в прототипе создается только один раз. Если у вас много привилегированных методов и вы создаете МНОГО экземпляров своих объектов, вы можете видеть, насколько это нежелательно, когда речь идет об использовании памяти.
Я предполагаю, что вы хотите скрыть некоторые из своих внутренних функций от внешнего мира, поэтому вам нужно будет использовать привилегированные методы. Для всех ваших геттеров/сеттеров вам нужно будет определить их как привилегированные и добавить в this
(иначе нет особого смысла создавать геттеры/сеттеры, если вы планируете оставить их частными):
function SomeClass() {
// Private member
var _privateMember = 1;
// Public variable
this.publicMember = 1;
// Privileged getter method
this.getPrivateMember = function() {
return _privateMember;
};
// Privileged setter method
this.setPrivateMember = function(newVal) {
_privateMember = newVal;
};
// Private method that has access to '_privateMember' and 'this'
var _privateMethod = function() {
// Modify private member
_privateMember = 2;
// Modify public member
this.publicMember = 1;
// Do some other fancy processing privately
};
this.doSomethingAwesome = function() {
// Do some stuff here...
// Call your private method maybe?
_privateMethod();
};
}
// Public methods on prototype do not have access to private methods in your constructor
SomeClass.prototype.publicMethod = function() {
// Cannot access `_privateMember`
this.publicMember = 2; // Does have access to 'this'
};
Что касается вашего последнего вопроса, об использовании частного или привилегированного метода для изменения некоторых частных членов... Как вы сказали, вы не сможете получить к нему доступ из внешнего мира, что означает, что это будет довольно бесполезно, если вы добавляют другие функции к вашему частному методу получения и выставляют его внешнему миру через привилегированный метод. Если вы делаете много тяжелой работы внутри конструктора вашего объекта, это может быть веской причиной для создания многоразового метода получения/установки, но это действительно зависит от вашего варианта использования.
Если это не ответило на ваш вопрос, или если вам нужно какое-либо другое конкретное объяснение чего-либо, не стесняйтесь спрашивать.
person
DRiFTy
schedule
20.06.2014