1

私は作成しようとしている単純な Javascript クラスを持っていますが、それが起こっているようには見えない問題に遭遇するまではうまくいきました。私は次のクラスを持っています:

function circle(paper) {
        var x = null;
        var y = null;
        var r = null;

        var x1 = null;
        var y1 = null;
        var R = 0;
        this.G = 0;
        this.B = 0;
        this.lineSize = 1;

        this.paper = paper;

        var that = this;
        this.set = function(x,y,r){
            that.x = x;
            that.y = y;
            that.r = r;
        }

        this.colorOut = function(){
              console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
        }
}

さて、Rは何をしても未定義になっていますが、そうすると、var R = null;セットでthat.R = 0;突然定義されます。しかし、多くのSOの投稿がこれらの問題にリンクしているcrockfordのサイトで見つけたものから、彼は私がしていることをやっているようで、うまくいっています。次のコードに見られるように:

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;

    this.service = function () {
        return dec() ? that.member : null;
    };
}

さて、私がここで理解していないこと、または誤解していることはありますか? 私は JS のクラスがどのように機能するかについては初めてで、Java/C++ クラスに慣れています。とにかく、さらに情報が必要な場合は質問してください!ありがとう多くの!

4

1 に答える 1

5

の間には大きな違いがあります

var R;

this.R = something;

1 つ目は、ローカル変数の宣言です。どのオブジェクトにもプロパティを追加しません。関数はそのコンストラクター内で作成されるため、変数は、オブジェクトのプロパティに関連付ける関数内で表示されます。変数 "R" は、関数がインスタンス化されるときに形成されるクロージャの一部です。

2 つ目は、作成中のオブジェクトに "R" というプロパティを設定します。

編集— さらなる明確化:

    this.colorOut = function(){
          console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
    }

その関数では、構築されたオブジェクトのプロパティとして "R" を参照します。というthat.Rことです。そのvar R;宣言しかない場合、オブジェクトにはそのようなプロパティはありません。ただし、ローカル変数があるため、関数を変更できます。

    this.colorOut = function(){
          console.log("R: " + R + " G: "+this.G+" B: "+this.B);
    }

それが何であれ、ローカル変数「R」の値が表示されます。(初期化しない場合はそのままになりundefinedます。)

于 2013-11-07T18:35:57.400 に答える