在Javascript对象中使用'this'

时间:2012-11-24 19:44:52

标签: javascript arrays object indexing

让'this'按照我的预期行事时遇到一些麻烦 -

基本上,我有一个对象,我无法从同一对象中的函数访问对象中的数组 -

看起来像这样:

var articles = {
    article : {
        1: {
            title : 'This is a Title',
            content : 'This is the content of the article'
        },
        2: {
            title : 'This is the second article',
            content : 'This is the second article content'   
        },
        3: {
            title : 'This is the third article',
            content : 'Making information transferrable. Identifiable. Manipulatable.'   
        }
    },
    numArticles : function(){
        var size = 0, key;
        for (key in this.article){
            if(this.article.hasOwnProperty(key)) size++;               
        }
        return size;
    },
    buildInterface : function(){
        var aSize = this.numArticles();
        for(var i = 0; i < aSize; i++){
            $('body').append('<article><h2>' + this.article[i].title + '</h2></article>');               
        }
    }
}

在这种情况下,buildInterface()函数无法访问“article”数组。

以下是一个正在进行中的示例:

http://jsfiddle.net/merk/xV2n6/41/

任何帮助都将不胜感激 -

我有预感这可能是一个范围问题 - 希望它不是与JSFiddle相关的东西 -

非常感谢 -

和平

标记

2 个答案:

答案 0 :(得分:3)

您的article变量的索引不一致:属性是从1开始定义的,但您从0方法buildArticles循环中的for开始。你可以用......解决这个问题。

for(var i = 1; i <= aSize; i++){
  $('body').append('<article><h2>' + this.article[i].title + '</h2></article>');               
};

...或(这对我的口味来说要好得多,因为你基本上试图使用Object来完成数组的工作)将article定义重写为一个合适的数组:

article : [{
        title : 'This is a Title',
        content : 'This is the content of the article'
    }, {
    title : 'This is the second article',
    content : 'This is the second article content'   
    }, {
    title : 'This is the third article',
    content : 'Making information transferrable. Identifiable. Manipulatable.'   
    }],
...

...让你的buildArticles for循环播放(因为索引现在正确地从0开始)。

顺便说一下,这样你甚至不需要做一个特殊的功能来计算你的文章:article.length就足够了。

这是JS Fiddle这种方法的例子。


作为旁注,如果您实际检查过调试器,您会注意到它是this.articles[0] undefined(因此尝试从title取出它是错误的),而不是this.articles。因此,这绝对不是范围问题。

答案 1 :(得分:0)

这应该有效:

var articles = {
    article : {
        1: {
            title : 'This is a Title',
            content : 'This is the content of the article'
        },
        2: {
        title : 'This is the second article',
        content : 'This is the second article content'   
        },
        3: {
        title : 'This is the third article',
        content : 'Making information transferrable. Identifiable. Manipulatable.'   
        }
    },
    numArticles : function(){
        var size = 0, key;
        for (key in this.article){
            if(this.article.hasOwnProperty(key)) size++;               
        }
        return size;
    },
    buildInterface : function(){
        var aSize = this.numArticles();
        for(var i = 1; i <= aSize; i++){
            console.log( '<article><h2>' + this.article[i]['title'] + '</h2></article>');               
        };
    }
}

在您的情况下,您已经开始使用数组中零位置的元素。但你没有0元素。所以它会给你一个错误。这是按预期工作的。