1. このサイトではcookie (クッキー) を使用しています。サイトの利用を継続した場合、cookieの使用に同意したものとみなさせていただきます。 詳しくはこちらをご覧ください。

【解決済み】アンダースコアについて教えてください

hogeq2019-10-08に開始した「ツクールMV」の中の討論

  1. hogeq

    hogeq ユーザー

    _canvas
    __canvas
    この違いは何ですか?

    最初のは、JSにおけるプライベートプロパティを表しているんですよね?
    (直接参照設定するな)

    2つ目は何でしょうか?
     
    #1
  2. トリアコンタン

    トリアコンタン モデレーター スタッフ モデレーター

    こんにちは!
    コアスクリプトの少し難しい話をします。

    ご推察のとおり「_canvas」はプライベートプロパティを指します。
    (ただし、これはあくまでツクールMVのコアスクリプトが採用している作法であって、JavaScriptの言語仕様、制約ではないのでご注意ください)

    そして同時に「_canvas」は、プロパティ「canvas」が「アクセサプロパティ」である場合に、実体が格納される変数を指すこともあります。
    「アクセサプロパティ」とは、外部から通常のプロパティのように参照、設定しているように見せていて、実際には対応するGetter, Setterが呼ばれる、という特殊なプロパティです。

    ・参考
    https://developer.mozilla.org/ja/do...erence/Global_Objects/Object/defineProperties

    以下のように定義することで外部からはプロパティ「canvas」にアクセスしているように見せて、実際には「_canvas」の値を返しています。
    コード:
    Object.defineProperty(Bitmap.prototype, 'canvas', {
        get: function() {
            return this._canvas;
        },
        configurable: true
    });
    
    このような手法を採用する理由は例えば以下の通りです。
    1. 取得はできるが設定はできない(読み取り専用)なプロパティを作りたい。
    2. 取得時に値がundefinedだった場合に初期値を返したい。
    3. 設定時に連動して他の変数に値を設定したい。
    4. 設定時に値の検証(1以上の数値でないとダメ等)がしたい。
    5. 後方互換性を保ちつつ、内部の仕様を変えたい。


    では「__canvas」とはなんでしょうか。
    前述したルールに照らし合わせると、『プロパティ「_canvas」が「アクセサプロパティ」である場合に、実体が格納される変数』です。

    実は、コアスクリプトには以下のような定義もあります。
    コード:
    Object.defineProperties(Bitmap.prototype, {
        _canvas: {
            get: function(){
                if(!this.__canvas)this._createCanvas();
                return this.__canvas;
            }
        },
        ...
    }
    
    プロパティ「canvas」を参照すると、実体の「_canvas」を取得し、さらにその実体の「__canvas」を取得して返す……という複雑な流れです。
    何故このような回りくどい作りになっているのかというと、コアスクリプトの画像表示のロジックが、軽量化やメモリ節約のために幾度となく変更、改良を重ねてきた、という歴史的経緯があるためです。

    ツクールMVのコアスクリプトは、軽量化を実現しつつ、過去のプラグインが引き続き正常動作し続けるために慎重に修正する必要がありました。
    なので外部からの参照、設定のロジックを変えずに、内部仕様を変更できるアクセサプロパティという手法が随所で採用されることになった、というわけです。
    (これは先ほど挙げた理由のうちの「5」に該当します)
     
    #2
    沫那環, 神無月サスケ, ganges他6人がいいね!しています
  3. hogeq

    hogeq ユーザー

    _canvasにアクセスすると__canvasが返されるわけですか。
    実体の実体ですね。
    改良の繰り返しでこういう仕様になっていると。
    分かりやすい説明ありがとうございます。

    しばらく回答がなかったので見てませんでした。
    遅くなって済みません。
     
    #3
    神無月サスケトリアコンタン がいいね!しています

このページを共有