1

我正在尝试使用一组对象创建一个对象。例如:我想创建一个具有多个标题的 Page 对象。我需要一个 addHeader() 和 getHeaders() 方法。标头本身是一个具有很少属性(例如名称和 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 回答