Вопрос мутатора Javascript в псевдо-классе
Вот код:
var Circle = function( radius )
{
var _radius = radius,
_area = function()
{
return Math.PI * _radius * _radius;
},
_perimeter = function()
{
return 2 * Math.PI * _radius;
};
this.radius = _radius;
this.area = "Area" + _area();
this.perimeter = "Perimeter" + _perimeter();
this.setRadius = function( radius ) {
_radius = radius;
};
};
Однако я не могу получить функцию this.setRadius() для успешного изменения закрытых свойств. Например, я запускаю это:
var circle = new Circle(5);
alert(circle.area);
circle.setRadius(10);
alert(circle.radius);
И он выводит 78.blah, который является правильным, затем он выводит радиус 5.
Любые предложения будут ценны! Я думал, что, поскольку свойство _area - это функция, оно будет каждый раз пересчитываться, но я полагаю, что нет? но почему this.radius не возвращает новый радиус, когда он явно сбрасывается?
Спасибо!
РЕДАКТИРОВАТЬ:
Хорошо, спасибо за то, что радиус не работает правильно. Это немного очевидно. Как уже указывалось, я никогда не обновляю этот.radius. Однако остается факт, что значения _area и _perimeter также не обновляются.
Я бегу:
var circle = new Circle(5);
alert(circle.area);
circle.setRadius(10);
alert(circle.area);
И я все еще получаю старую область даже после обновления радиуса. Обратите внимание, что функция _area зависит от _radius, а не от this.radius.
2 ответа
Спасибо, ребята, я решил сделать это следующим образом:
var Circle = function( radius )
{
var _radius = radius;
this.radius = function()
{
return _radius;
};
this.area = function()
{
return Math.PI * _radius * _radius;
}
this.perimeter = function()
{
return 2 * Math.PI * _radius;
}
this.setRadius = function( radius ) {
_radius = radius;
};
};
Это работает сейчас. Спасибо за советы!
Простой ответ заключается в том, что вы не устанавливаете свойство radius в функции setRadius.
Вы устанавливаете частное свойство _radius, но в вашей функции нет ничего, что обновляет this.radius.
РЕДАКТИРОВАТЬ: я обновил свой ответ, как я бы решил эту проблему. Наверное, может быть лучше, но это простой способ сделать это.
var Circle = function( radius )
{
var radius, area, perimeter;
this.setRadius = function( radius ) {
var _radius = radius,
_area = function()
{
return Math.PI * _radius * _radius;
},
_perimeter = function()
{
return 2 * Math.PI * _radius;
};
this.radius = _radius;
this.area = "Area" + _area();
this.perimeter = "Perimeter" + _perimeter();
};
this.setRadius(radius);
};