Один из способов определить класс в Javascript - с помощью замыканий и литерала объекта. В качестве примера рассмотрим круг:
var circle = function(radius) {
var radius = radius;
return {
area: function() {
return Math.PI*(radius*radius);
}
}
}
Объекты Circle могут быть созданы с инкапсулированными внутренними переменными:
c = circle(1);
c.area(); // Returns pi
c.radius; // Returns undefined
К сожалению, при использовании этого метода, если бы я создал несколько кругов, функция области была бы скопирована для каждого экземпляра. Вот где обычно используется прототип:
var Circle = function(radius) {
this.radius = radius;
}
Circle.prototype.area = function() {
return Math.PI*(this.radius*this.radius);
};
Теперь проблема в том, что переменные не могут быть объявлены закрытыми:
c = new Circle(1);
c.area(); // Returns pi
c.radius; // Returns 1
Кто-нибудь знает, как бы я получил лучшее от обоих? Эффективность - это проблема, поэтому лучше избегать текущей формулировки первого метода, и я пишу для открытого API, поэтому не хочу, чтобы пользователи имели доступ к внутренним переменным / методам. Заранее спасибо ...