1

オブジェクトの配列を持つオブジェクトを作成しようとしています。例: 複数のヘッダーを持つ Page オブジェクトを作成したいと思います。addHeader() および getHeaders() メソッドが必要です。ヘッダー自体は、いくつかのプロパティ (name や id など) を持つオブジェクトです。ページオブジェクトの一部としてネストし、ヘッダーの配列に追加しようとしました(これはページの一部であると想定していましたが、それは理想的な解決策ではない可能性があります)。内部関数を実行しようとすると問題が発生します。私はこの質問を読んで、このトピックに似たものはほとんどありませんが、残念ながら解決策を思いつくことができません:

javascript でクラスベースのオブジェクトを持つ方法はありませんか?

私の最新の試み:

var Page = ( function () {
    function Page() {
        var headers = [];
        var header = {
            name:'',
            id:'',
            addHeader : function(name,id) {
                this.name = name;
                this.id = id;
                Page.headers.push(header);
            }
        };
        this.getHeaders = function() {
            for(var i=0; i< Page.headers.length; i++) {
                console.log(Page.headers[i]);
            }
        } 
    }
    return Page;
}) ();

getHeaders を実行しようとしているとき:

var p = new Page(); p.getHeaders();

私は得る:

p.getHeaders is not a function

私の JavaScript スキルはかなり基本的なものです。ヘルプやコメントをいただければ幸いです。回答ありがとうございます。

内部の addHeader 関数にアクセスする方法を誰かに説明してもらえますか? これは、javascript オブジェクトで関数をネストする正しい方法ですか?

4

2 に答える 2

4

あなたが持っている方法は、それgetHeadersが含まれているスコープに対してプライベートです。公開するには、次のように変更します。

this.getHeaders = function() {
    // implementation
};

編集

あなたのaddHeaderコメントについて-それがパブリック関数であると思われる場合は、パブリック関数と同じことをしてくださいgetHeaders。あなたはすべてをスキップすることができますvar header = {...};- あなたが言っていることに基づいて、あなたはそれをまったく必要としません. 関数は次のようになります。

var Page = (function () {
    function Page() {
        var headers = [];

        this.getHeaders = function () {
            for (var i = 0; i < headers.length; i++) {
                console.log(headers[i]);
            }
        };
        this.addHeader = function (name, id) {
            headers.push({ name: name, id: id });
        };
    }

    return Page;
})();

編集

プライベートメンバーにアクセスしているため、prototype機能しません。これらの関数は、まだアクセスできる内部に保持するheadersか、headers公開する必要があります。prototype回答の一部を削除しました。

于 2013-06-10T14:35:22.363 に答える
0

次のようなものが必要です。

//create a page object 'class'
function Page(){
  this.headers = [];          
};
//add functions to the page object
Page.prototype.addHeader = function(header){ this.headers.push(header); }
Page.prototype.getHeaders = function(){ return this.headers; }

function Header(opt){
  this.name = opt.name || ""; //default to empty string
  this.id = opt.id || null; //default to null id
}

//use it like so
Header header1 = new Header("title1","title1ID");
Page firstPage = new Page();
firstPage.addHeader( header1 );
于 2013-06-10T14:36:46.593 に答える