Javascript - 通过引用定义对象属性名称

时间:2011-08-04 22:24:32

标签: javascript jquery oop

我正在尝试在对象中设置一些属性。我不喜欢告诉对象从外面可以期待什么(使对象更灵活,imo),所以我尝试了这个,没有成功:

slideshow = {
    init : function(data) {
        if (!data)
            return false;

        $.each(data,
            function(index, value) {
                // this isn't working, and don't know how to
                this[index] = value;
            }
        );

        alert(this.options.interval);

        return true;
    },
};

认为很清楚缺少什么。

有什么想法吗?干杯!

更新

    var data = {
        options : [
            {
                interval : 8000,
                target : '#slider img',
            },
        ],
        images : [
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 1',
                description : 'blablabla descricao',
                url : 'http://www.google.pt',
            },
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 2',
                description : 'blablabla descricao 2',
                url : 'http://www.google.pt',
            },
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 3',
                description : 'blablabla descricao 3',
                url : 'http://www.google.pt',
            },
        ],
    }

3 个答案:

答案 0 :(得分:6)

您必须引用this

var self = this;
$.each(data, function(index, value) {
    self[index] = value;
});

或使用jQuery的jQuery.proxy方法:

$.each(data, $.proxy(function(index, value) {
    this[index] = value;
}, this));

否则,this会引用value,如documentation中所述。

答案 1 :(得分:2)

直接引用该对象:

$.each(data,
    function(index, value) {
     //     v------direct reference
        slideshow[index] = value;
    }
);

或不使用$.each(),只使用for-in循环作为对象,或for作为数组,因为这不会改变{{1} } value:

this

或者您可以使用jQuery.proxy()[docs]方法在 // I don't know if data is an Array or an object for( var n in data ) { this[ n ] = data[ n ]; } 处理程序中建立this值。

$.each()

答案 2 :(得分:1)

问题是,在传递给each的函数内部,this不再引用slideshow,而是引用当前迭代的value。你需要在进入每个循环之前存储幻灯片的引用:

slideshow = {
    init : function(data) {
        if (!data)
            return false;

        var that = this;

        $.each(data,
            function(index, value) {
                that[index] = value;
            }
        );
    },
};