1

私はこのjavascriptクラスを宣言しました:

var TablixColumns = function(){
this.g = 'wtf';
this.tablixColumns = []; //[];
return {
    addTablixColumn: function(tablixColumn){
        alert(this.g);
         //this.tablixColumns.push(tablixColumn.getTablixColumn());
    }
}
};

私の問題は、これを試してみるとalert(this.g)、アラートが未定義で出てくるということです。もちろん、最初の関数定義は次のように読み取られます。this.tablixColumns.push(tablixColumn.getTablixColumn());

pushしかし、「未定義のメソッドはありません」のようなエラーが表示されます

奇妙なのは、次のクラス宣言があることです。

         var TablixColumn = function(){
            columnWidth = '<Width>3.135cm</Width>'; //default width value

            return{
                setColumnWidth: function(width){
                    this.columnWidth = '<Width>' + width + 'cm</Width>';
                },
                getTablixColumn: function(){
                    return '<TablixColumn>' + this.columnWidth + '</TablixColumn>';
                }
            }
        };

そして、TablixColumn クラスは正常に動作します。はい、「this.」なしで this.g と this.tablixColumns を宣言しました。一部ですが、仕事を拒否しているだけです!今夜これがうまくいかなかったら誰かを殺すつもりです誰か助けてくれませんか?

4

2 に答える 2

1

thisネストされた関数式の外で、現在のオブジェクト ( ) への参照を設定する必要があります。コードは次のようになります。

var TablixColumns = function() {
    ...
    var self = this;

    return {
        addTablixColumn: function(tablixColumn) {
            alert(self.g);
        }
    };
};

必要に応じて、返されたオブジェクト リテラルにプロパティを設定することもできます。

// ...
    return {
        g: 'wtf',
        addTablixColumn: function(tablixColumn) {
        alert(this.g); // 'wtf'
        }
    };
// ...

TablixColumnsこのようにコンストラクタから戻る場合は、コンストラクタとして使用しないでください。ここでは 2 つのイディオムを使用しています。プロトタイプの継承とモジュール パターン。でコンストラクターをインスタンス化しnewますか? その場合は、オブジェクト リテラルを返さないでください。むしろ、関数のプロトタイプにメソッドを設定します。

var TablixColumns = function() {
    this.g = 'wtf';
    this.tablixColumns = [];
};

TablixColumns.prototype.addTablixColumn = function addTablixColumn() { ... };
TablixColumns.prototype./* ... */

...

thisそれ以外の場合は、コンストラクター内で使用しないでください。プロパティを通常の変数にするだけです。

于 2013-01-27T16:39:19.373 に答える
0

わかりましたので、私は自分の問題を理解しました:
現在のインスタンスの変数へのすべての参照は、キーワードが前にあるべきではなかったthis.ので、これが私の宣言が今どのように見えるかです:

        var TablixColumns = function(){
           g = 'wtf';
           tablixColumns = []; //[];
           return {
               addTablixColumn: function(tablixColumn){
                   alert(g);
                   tablixColumns.push(tablixColumn.getTablixColumn());
               }
           }
        };

これを指摘してくれてありがとう@Bergi

于 2013-01-27T17:07:37.150 に答える