他言語では、プロパティという言葉は、ゲッターとかセッターというメソッドを通してアクセスする変数のようにみえるけど、そうじゃないもの、として扱われているのですが、
JavaScriptは、そのあたりが、ちょっとグダグダなので、そうなってません。
単なるオブジェクトにぶら下がるpublic変数のことが、プロパティと呼ばれたりします。
変な話ですが、別にそこで混乱する事もないとは思います。目くじら立てることもないです。
そんな事よりも、prototype継承などで混乱させられる罠が満載ですので、そんなのは小さな問題です。
ただ、他言語から移植するときなどに、プロパティとプロパティアクセスメソッドが利用できないと、移植に苦労することになると思いました。
Nameプロパティに代入するときに、
setNameメソッドが呼ばれて欲しいときがあり、
Nameプロパティを読み取るときに
getNameメソッドが動作して欲しいときがあります。
移植時とかにNameプロパティへの入出力を、setName/getNameに書き直せば別にいいとは思いますが、
なんか書き方として、かっこ悪いです。
ということで、きれいなコード書きたいのに、書けないかな、と悩みがあり、
プロパティアクセスメソッドなんて、JavaScriptではできないんじゃないの?たぶん。
と思って、スタックオーバーフローで聞いたら、すぐに答えをもらいました。
すばらしい解答をいただきました。
JSのプロパティ入出力時にアクセスメソッドを動かしたい - スタック・オーバーフロー
答えを頂いた上で、自分が書いたコードを載せておきます。
var common = {};
(function () {
var _ = common;
_.Rect = function (top, left, height, width) {
if (!(this instanceof common.Rect)) {
return new common.Rect(top, left, height, width);
}
this.top = top;
this.left = left;
this.height = height;
this.width = width;
var getRight = function() {
return this.left + this.width;
};
var setRight = function(value) {
this.width = value - this.left;
};
var getBottom = function() {
return this.top + this.height;
};
Object.defineProperty(this, "right", {
get: getRight,
set: setRight
});
Object.defineProperty(this, "bottom", {
get: getBottom
});
};
}());
var rect1 = common.Rect(1,1,1,1);
rect1.top
rect1.left
rect1.height
rect1.width
に加えて、
rect.right
rect.bottom
を使用することができます
例では、getRightは、プロパティアクセスメソッドらしく、プライベートメソッドにしていますが
パブリック属性として外部に公開する書き方もできますし
(リンク先のStackOverFlowみて)
読み取り専用プロパティ、書き込み専用プロパティ、にもできるようです。
ES5なので、主要なブラウザでは全て対応していると思われます。
これで、クラスを作るときは、よりかっこよく書けるものを作れるでしょう。
参考にしてください。
素晴らしい回答くださった、StackOverFlowのBLUEPIXYさん。ありがとうございます。