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 関数は this.radius ではなく _radius に依存することに注意してください。

4

2 に答える 2

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 に答える
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 に答える