使用object方法访问对象属性

时间:2013-10-04 09:08:19

标签: javascript jquery ajax object

我正在尝试构建一个名为myApp的应用程序,它具有属性regularNameErrors和方法populateJSON,它使用AJAX调用来获取JSON对象,然后将该JSON对象添加到声明为该方法的参数之一的属性中。

获取数据的功能肯定有效,因为位置3的警报给出了正确的键列表。但是1处的警报返回undefined,警报处于2空白。

当我再次用destination = data替换myApp.regularNameErrors = data行时,它可以工作,所以我认为我误解了如何将对象属性传递给对象方法。但是我想多次使用populateJSON方法,并且需要知道传递它属性的正确方法。

var myApp = {
init: function () {
    myApp.populateJSON(myApp.regularNameErrors, 'data/spelling.json').done(function () {
        alert(myApp.regularNameErrors['kingscross']); //1
    });
},
regularNameErrors: {}, //Object of spelling mistake:proper key:value pairs
populateJSON: function (destination, source) {
    var def = $.Deferred();
    $.getJSON(source, function (data) {
        destination = data;
        alert(Object.keys(myApp.regularNameErrors)); //2
        alert(Object.keys(data)); //3
        def.resolve();
    });
    return def.promise();
},
};

2 个答案:

答案 0 :(得分:0)

由于能够使用返回的getJSON对象的延迟属性,函数可以减少到几行,这样就不必创建一个名为populateJSON的新函数

var myApp = {
init: function () {
    $.getJSON('data/spelling.json').done(function(data) {
        myApp.regularNameErrors = data;
    });
},
regularNameErrors: {},
};

答案 1 :(得分:0)

destination不是传递给函数的属性的“指针”,而是一个包含属性求值的值的变量。当您分配到destination时,您只需写入populateJSON函数的局部变量。

如果您希望能够声明目标,则需要传递基础对象(或始终使用myApp)和属性名称:

var myApp = {
    init: function () {
        myApp.populateJSON('regularNameErrors', 'data/spelling.json', function() {
            alert(Object.keys(myApp.regularNameErrors)); //2
            alert(myApp.regularNameErrors['kingscross']); //1
        });
    },
    regularNameErrors: {}, //Object of spelling mistake:proper key:value pairs
    populateJSON: function (destinationName, source, callback) {
        $.getJSON(source, function (data) {
            myApp[destinationName] = data;
            alert(Object.keys(data)); //3
            callback();
        });
    }
};

但是,我发现你正在使用promise模式。承诺不应该用作简单的通知程序(“现在数据已经到达某处”),但它应该代表数据本身(“现在,这里是数据” ) - 使用数据解析它,而不是将数据存储在全局变量/属性中,并且无需解析。实际上,$.ajax does already return such a promise所以你不必为此做很多事情:

var myApp = {
    init: function () {
        myApp.regularNameErrors = $.getJSON('data/spelling.json');
        myApp.regularNameErrors.done(function(data) {
            alert(Object.keys(data)); //3
            alert(data['kingscross']); //1
        });
    }
};