具有嵌套对象数组和相应函数的对象

时间:2013-06-10 14:31:38

标签: javascript

我正在尝试使用对象数组创建一个对象。 例如:我想创建一个包含多个标头的Page对象。 我需要一个addHeader()和getHeaders()方法。标头本身是一个具有很少属性的对象(例如名称和标识)。我一直试图将它嵌入页面对象作为其部分,并将其添加到Headers数组(我假设它将是Page的一部分,但这可能不是理想的解决方案)。 当我尝试执行内部函数时,我遇到了麻烦。 我读了这个问题并且很少有关于这个主题的相似内容,遗憾的是我无法提出解决方案:

No ways to have class-based objects in 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对象中嵌套函数的正确方法吗?

2 个答案:

答案 0 :(得分: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部分。

答案 1 :(得分: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 );