我有这个构造函数对象:

function Bindable(obj) {
    var prop;

    for (prop in obj) {
        this.__defineGetter__(prop, function () {
            return obj[prop];
        });

        this.__defineSetter__(prop, function (val) {
            obj[prop] = val;
        });
    }
}


像这样被调用:

var model = new Bindable({
    name: 'Dave',
    level: 10,
    strength: 5
});


如果我console.log(model),输出为:

Bindable { name=5, level=5, strength=5 }


为什么将相同的值分配给构造函数中的每个属性?

最佳答案

您正在创建一个闭包,该闭包将在执行getter / setter函数时(而不是在定义它们时)进行评估。它们执行时,prop具有在循环执行期间分配的最后一个值。您需要避免在prop上创建闭包。一种方法是使用IIFE。而不使用此参数:

function () {
    return obj[prop];
}


采用

(function(p) {
    return function() {
        return obj[p];
    };
}(prop));

关于javascript - 使用getter和setter将参数复制到对象实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17202767/

10-11 22:10
查看更多