为什么我的属性分配不正确?

时间:2013-07-22 20:30:33

标签: javascript

我创建了一个ObservablePropertyList,它应该在属性更改时执行回调。实施是:

function ObservablePropertyList(nameCallbackCollection) {
    var propertyList = {};

    for (var index in nameCallbackCollection) {

        var private_value = {};

        propertyList["get_" + index] = function () { return private_value; }
        propertyList["set_" + index] = function (value) {

            // Set the value
            private_value = value;

            // Invoke the callback
            nameCallbackCollection[index](value);
        }
    }

    return propertyList;
}

这是一个快速的测试演示:

var boundProperties = BoundPropertyList({
    TheTime: function (value) {
        $('#thetime').text(value);
    },
    TheDate: function (value) {
        $('#thedate').text(value);
    }
});

var number = 0;

setInterval(function () {
    boundProperties.set_TheTime(new Date());
    boundProperties.set_TheDate(number++);
}, 500);

出于某种原因,属性未正确分配或其他内容。也就是说,由于某种原因调用set_TheTime执行set_TheDate的回调,几乎就像它将所有内容绑定到列表中的最后一项一样。我不能为我的生活弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

使用这样的循环时,需要将其包装在机箱中

function ObservablePropertyList(nameCallbackCollection) {
    var propertyList = {};

    for (var index in nameCallbackCollection) {
        (function(target){
           var private_value = {};

           propertyList["get_" + index] = function () { return private_value; }
           propertyList["set_" + index] = function (value) {

               // Set the value
               private_value = value;

               // Invoke the callback
               target(value);
           }
        })(nameCallbackCollection[index]);
    }

    return propertyList;
}

答案 1 :(得分:1)

您需要创建一个闭包,以便for循环的每次迭代都有自己的private_variable对象。否则,每次迭代都会覆盖前一次(因为private_variable被提升到其范围的顶部)。我把它设置成这样:

var ObservablePropertyList = (function () {
    "use strict";

    var handleAccess = function (propList, key, callback) {
        var privValue = {};

        propList["get_" + key] = function () {
            return privValue;
        };
        propList["set_" + key] = function (value) {
            // Set the value
            privValue = value;

            // Invoke the callback
            callback(value);
        };
    };

    return function (coll) {
        var propertyList = {}, index;

        for (index in coll) {
            handleAccess(propertyList, index, coll[index]); 
        }

        return propertyList;
    };
}());

var boundProperties = ObservablePropertyList({
    TheTime: function (value) {
        $('#thetime').text(value);
    },
    TheDate: function (value) {
        $('#thedate').text(value);
    }
}), number = 0;

setInterval(function () {
    boundProperties.set_TheTime(new Date());
    boundProperties.set_TheDate(number++);
}, 500);

DEMO: http://jsfiddle.net/PXHDT/