0

パブリック メソッドとパブリック変数を使用して JavaScript オブジェクトを作成しようとしています。

jeeni.DataGrid = (function(elementId){
    var divId = elementId;
    var div;
    var saveUrl;
    var columns;
    var dataUrl;

    var validate = function(){
        console.log("divId: " + (divId));
        console.log("div: " + div);
        console.log("saveUrl: " + saveUrl);
        console.log("columns: " + columns);
        console.log("dataUrl: " + dataUrl);
    };

    return {
        toString:validate,
        dateURL:dataUrl,
        saveURL:saveUrl,
        columnDefs:columns
    };

});

そして、私はそれを次のように使用します:

<script>
    $(document).ready(function() {

        var grid = new jeeni.DataGrid("myDataGrid");

        grid.saveURL = "http://www.jeeni.co.uk/grid/save";
        grid.dataURL = "http://www.jeeni.co.uk/grid/data";
        grid.columnDefs = "[{text:'Column1',width:75}, {text:'Column2',width:150}]";
        grid.toString();
    });
</script>

しかし、コンソールで次のようになります。

divId: myDataGrid
div: undefined
saveUrl: undefined
columns: undefined
dataUrl: undefined

未定義の変数が未定義である理由を誰でも説明できますか? リターンはそれらを公開しませんか?そして、ゲッターとセッターを使用せずにそれらを割り当て可能にするにはどうすればよいですか。

ありがとう

4

3 に答える 3

1

現在、プライベート変数を取得し、値を抽出して、それらをオブジェクトで返しています。返されるオブジェクトには、プライベート変数への参照がなく、コピーがあるだけです。関数を呼び出した後に値を再割り当てすると、プライベート変数ではなくコピーのみが変更されます。

オブジェクトのすべてのプロパティは REFERENCE を介して取得されるため、オブジェクトにデータを直接保存する必要があります。例:

jeeni.DataGrid = function(elementId){

    // These are private
    var divId = elementId;
    var div;

    var public = {
      "toString"   : validate,
      "dateURL"    : null,
      "saveURL"    : null,
      "columnDefs" : null
    };

    function validate(){
        console.log("divId: "   + divId);
        console.log("div: "     + div);
        console.log("saveUrl: " + public.saveURL);
        console.log("columns: " + public.columnDefs);
        console.log("dataUrl: " + public.dataURL);
    };

    return public;

};
于 2013-01-24T08:10:12.727 に答える
0

パターンはプライベート フィールドを構築します (多くの場合、それが使用される主な理由です)。だからあなたがするとき

grid.saveURL = ...

既存の非表示のフィールドを変更するのではなく、新しいフィールドを追加するだけです。

パブリック フィールドが必要な場合は、次のようにします。

jeeni.DataGrid = function(elementId){
    this.divId = elementId;
};
jeeni.DataGrid.prototype.validate = function(){
    console.log("divId: " + (this.divId));
    console.log("div: " + this.div);
    console.log("saveUrl: " + this.saveUrl);
    console.log("columns: " + this.columns);
    console.log("dataUrl: " + this.dataUrl);
};

フィールドを非公開にしたい場合は、それらを変更する関数を追加する必要がありますが、それはあなたの場合はより重くなります。

于 2013-01-24T08:00:36.680 に答える
0

()関数をすぐに呼び出して、返されたオブジェクトを に割り当てる場合は、関数宣言の最後にを追加する必要がありますjeeni.DataGrid。例えば、

var obj = (function (someArg1) {
    return { pubVar1 : someArg1 };
}("Hello World"));

//Alerts "Hello World".
alert(obj.pubVar1); 

関数/変数の戻り値をテストするには、いつでもconsole.log(obj)ブラウザーのデバッグ コンソールを使用して出力を調べることができます (Chrome を使用している場合は、通常 F12 でこのコンソールが表示されます)。

お役に立てれば!

于 2013-01-24T08:03:55.757 に答える