LoginSignup
1
2

More than 5 years have passed since last update.

JavaScript プロパティアクセスメソッド

Last updated at Posted at 2017-06-07

他言語では、プロパティという言葉は、ゲッターとかセッターというメソッドを通してアクセスする変数のようにみえるけど、そうじゃないもの、として扱われているのですが、

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さん。ありがとうございます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2