2

Javascript のオブジェクトがあり、コンストラクターに渡されたデータを、後でより多くのデータを使用して外部から呼び出すことができる関数を使用して処理したいと考えています。当然、コードを複製したくありません (コンストラクターで 1 回、関数で 1 回)。

ネストされた関数を使用できますが、これは非効率的だと言われています:

function MyOb(data) {
    this.myData = {};
    function addData(newData) {
        //Add newData to myData
    }
    addData(data);
}

しかし、プロトタイプを使用すると、3 行目に「変数 addData が見つかりません」というエラーが表示されます。

function MyOb(data) {
    this.myData = {};
    addData(data);
}

MyOb.prototype.addData = function(newData) {
        //Add newData to myData
}

それで、ネストされた関数を使用するか、自分自身を繰り返す必要がありますか、またはプロトタイプを使用してこれを機能させる方法はありますか?

4

3 に答える 3

5

変化する

function MyOb(data) {
    var myData;
    addData(data);
}

function MyOb(data) {
    this.myData = {}; // or another initialization
    this.addData(data);
}

thisJavaScript オブジェクトで明示的に指定する必要があります。

using を使用すると private になることにも注意してください。関数var myDataを含め、コンストラクターの外部で定義された関数からこの変数を使用することはできませんaddDatathis.myDataそのため、おそらく代わりに必要です。

于 2013-06-17T12:28:10.620 に答える
1

プロトタイプを使用して、新しいオブジェクトを作成する必要があります。

var abc = new MyOb(data);

次に、次を使用して関数にアクセスできますthis

function MyOb(data) {
    var _myData; // local variable in this scope (addData won't have access)
    this.myData = {}; // public variable
    this.addData(data);
}

newオブジェクトの構築に を使用しない場合、は にthisなりwindow、コードは機能しません。

于 2013-06-17T12:28:31.093 に答える
1

ネストされた関数をオブジェクトのプロパティとして公開する必要があります。

function MyOb(data) {
    var myData;
    function addData(newData) {
        //Add newData to myData
    }
    addData(data);
    this.addData = addData;
}

プロトタイプを使用した現在のコードは、関数を変数のように取得しようとしているのに、インスタンスの (継承された) プロパティ (によって参照されるthis) であるという問題に悩まされています。ただし、次のように変更します。

    this.addData(data);

プロトタイプ関数でエラーが発生can't find variable myDataします。これは、コンストラクターに対してローカルな変数です。プロトタイプを使用するには、インスタンス プロパティも作成する必要があります。Javascript: Do I need to put this.var for every variable in an object?も参照してください。.

于 2013-06-17T12:28:49.167 に答える