【问题标题】:Javascript mutator issue in pseudo class伪类中的 Javascript mutator 问题
【发布时间】:2013-04-27 19:39:04
【问题描述】:

代码如下:

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。

【问题讨论】:

    标签: javascript design-patterns mutators


    【解决方案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;
        };
    };
    

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

    【讨论】:

      【解决方案2】:

      简单的答案是因为您没有在 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);
      };
      

      【讨论】:

      • 好吧,为什么它没有设置 this.radius 是有道理的。但是当我在设置不同的半径后运行 circle.area 时,它也不会更新区域。这是为什么呢?
      • _radius 正在重置,_area 依赖于 _radius 而不是 this.radius
      • 您的函数以程序化方式建模。这意味着项目按特定顺序执行。通过重新定义半径,您将需要重新计算其余的数学以使一切正确。您放置的代码不会自动执行此操作。
      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多