伪类中的Javascript mutator问题

时间:2013-04-27 19:39:04

标签: javascript design-patterns mutators

以下是代码:

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在显然被重置时没有返回新的半径?

谢谢!

编辑:

好的,谢谢为什么半径不能正常工作。这有点显而易见。正如所指出的,我永远不会更新this.radius。但是,重点仍然是_area和_perimeter值也不会更新。

我跑:

var circle = new Circle(5);
alert(circle.area);
circle.setRadius(10);
alert(circle.area);

即使在更新半径后我仍然会得到旧区域。请注意,_area函数依赖于_radius而不是this.radius。

2 个答案:

答案 0 :(得分:1)

简单的答案是因为你没有在setRadius函数中设置radius属性。

您设置私有属性_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);
};

答案 1 :(得分:1)

谢谢大家,我决定采用以下方式:

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;
    };
};

现在有效。感谢您的提示!