0

这是代码:

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。

4

2 回答 2

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

现在可以了。感谢您的提示!

于 2013-04-27T19:52:46.383 回答
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);
};
于 2013-04-27T19:43:46.327 回答