0

次のコードを検討してください。

function rectangle(x, y) {
    this.width = x;
    this.height = y;
    this.calcArea = function() {
        return (this.width * this.height);
    };
}

オブジェクトには、2つのrectangleプロパティ(幅と高さ)と1つのメソッド(calcArea)があります。

長方形オブジェクトに別のプロパティを追加したいと思います:area。私は次のようにプロトタイプメソッドを介してこれを行います:

rectangle.prototype.area = function () {return this.calcArea();}

ここで、長方形の新しいインスタンスを作成するとします。var r = new rectangle(2,3); 残念ながら、areaこれはメソッドです。正しい値を取得するには、を呼び出す必要がありますr.area();

area(少なくとも)プロパティであり、メソッドではないはずなので、の結果calcArea()r.areaプロパティに直接割り当てる方法はありますか?

プロトタイプをこれに変更すると:

rectangle.prototype.area = function () {this.area = this.calcArea();}

一度電話をかける必要があります。そうすれば、r.area()その後のすべての電話はr.area必要に応じて番号になります。悪くはありませんが、完璧ではありません。それで、より良い方法はありますか?

4

3 に答える 3

2

長方形の面積は、長方形ごとに変化する他のプロパティから計算されます。したがって、エリアはプロトタイプではなく、各インスタンスに属します。とにかく、Rectangleのすべてのインスタンスによって隠されるプロパティをプロトタイプに含めることには意味がありません。ただし、各長方形で同じであるため、計算はプロトタイプに属することができます。

値を取得するには、あなたが言ったように、少なくとも1回はそれを計算する必要があります。この計算はRectangleのコンストラクターで実行できますが、メソッドを複製する必要がないため、プロトタイプにメソッドを残しておくことをお勧めします。

function Rectangle(x, y) {
    this.width = x;
    this.height = y;
    this.area = this.calculateArea();
}

Rectangle.prototype.calculateArea = function(){
    return this.width * this.height;
}

ただし、作成後に長方形の寸法を変更しても、この値は更新されないことに注意してください。このため、このプロパティが頻繁に呼び出され、パフォーマンスが問題にならない限り、より安全であるため、常にオンデマンドで計算します。

于 2012-11-19T15:28:32.400 に答える
1
function rectangle(x, y) {
    this.width = x;
    this.height = y;
    this.calcArea = function() {
        return (this.width * this.height);
    };
    this.area = this.calcArea();
}

この方法で行うことができますが、またはthis.areaを変更しても更新されません。しかし、これを確認することができます:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty それはあなたを助けるかもしれません。widthheight

于 2012-11-19T14:37:34.900 に答える
1

コンストラクターで計算してみませんか?

function rectangle(x, y) {
    this.width = x;
    this.height = y;
    this.area = x*y;
    ..
}

問題は、widthまたはを更新しても更新されないということですheight。その場合はこれを使用してください。

function rectangle(x, y) {
    this.width = x;
    this.height = y;
    this.area = x*y;
    this.updateWidth = function(w){
        this.width = w;
        this.area = this.width*this.height;
    }
    this.updateHeight = function(h){
        this.height = h;
        this.area = this.width*this.height;
    }
}
于 2012-11-19T14:38:04.057 に答える