Вопрос мутатора 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);
};
Другие вопросы по тегам