访问数组中的对象,该对象是另一个对象(Javascript)的属性

访问数组中的对象,该对象是另一个对象(Javascript)的属性,javascript,oop,Javascript,Oop,我已经很久没有学习OOP了,而且我对JS还不熟悉,所以对于更高级的用户来说,事情可能看起来很奇怪-对不起:) 现在我创建两个对象: startPage = new page("start"); somePage = new page("foo"); …并尝试将somePage添加到startPage中的数组中: startPage.addToSubPages(somePage); 现在这似乎不起作用了,尽管它应该是正确的,如果我没弄错的话 console.log(startPage.get

我已经很久没有学习OOP了,而且我对JS还不熟悉,所以对于更高级的用户来说,事情可能看起来很奇怪-对不起:)

现在我创建两个对象:

startPage = new page("start");
somePage  = new page("foo");
…并尝试将
somePage
添加到
startPage
中的数组中:

startPage.addToSubPages(somePage);
现在这似乎不起作用了,尽管它应该是正确的,如果我没弄错的话

console.log(startPage.getSubPages());
这表明数组中有东西,但对象似乎是空的。我做错了什么? 另外:如何访问该数组中的某个元素?如下所示:
startPage.getsubpage()[0].getFoo()

编辑:天哪,鲭鱼,蝙蝠侠!这更像我的实际代码: 你说得对,我发布的代码确实有效。一旦继承开始发挥作用,它就不再起作用了。为什么呢?它应该像上面的代码一样工作,对吗

function page(title) {
    this.title = title;
}

function subPage() {
    this.contentPages = [];
}
subPage.prototype = new page;
有两个问题

  • 您没有在
    子页面中调用
    页面
  • 使用
    Child.prototype=新的父级这是错误的,请使用
    对象。改为创建
  • 所以固定的代码是

    function page(title) {
        this.title = title;
    }
    
    function subPage(title) {
        page.call(this, title);
        this.contentPages = [];
    }
    subPage.prototype = Object.create(page.prototype);
    

    你凭什么认为这是坏的?对我有用吗<代码>控制台.log(起始页.子页[0].标题)也要避免无用的代码,比如
    getX()
    这是Java反模式。@Raynos:我不确定这是反模式。封装在JavaScript中也很有用(在野外对我也很有用)。@Matt如果有用是指浪费计算,那么是的。参见@Raynos链接的文章提到了由于不正确理解javascript作用域和创建匿名闭包作为私有数据的抽象而引起的复杂情况,而所有这些都不理解您可能正在抽象的框架的内部工作原理。我提到这一点的唯一原因是,我完全没有意识到在javascript对象上使用getter/setter级别的封装会产生有害影响。ES5-shim应该用于旧的支持。或其他类型的对象。创建垫片
    function page(title) {
        this.title = title;
    }
    
    function subPage(title) {
        page.call(this, title);
        this.contentPages = [];
    }
    subPage.prototype = Object.create(page.prototype);