影响Node.js中回调内对象的属性

时间:2011-11-10 19:33:29

标签: javascript node.js iteration

我正在使用一些辅助方法在Node.js中编写一个简单的原型,我可能需要在使用该原型的对象中。我想要的一种方法是实现jQuery的.each()。我在他们的开发版本中看了jQuery的实现,并尝试在我的简化版本中模拟它。

// Loop through the object using a callback
BaseProto.prototype.each = function (cb, args) {
    var obj = this.get(),   // Get our object as a plain object
        prop;

    /** Code to make sure the the args passed are actually an array **/

    if (typeof cb === "function") {
        // For each property in our object
        for (prop in obj) {
            // Apply the callback to the object's property and pass
            // the index, the property, and whatever else as arguments
            if (cb.apply(obj[prop], [ prop, obj[prop] ].concat(args)) === false) {
                // Get out if the function returns false
                break;
            }
        }
    }

    // Reset our object with the new one
    return this.reset(obj);
};

问题是虽然回调肯定被触发,但它对对象的属性没有任何影响。无论我在回调中做什么,更改都会保留在回调范围内。

以下是我一直在测试的简单回调示例。

var BaseProtoTestObj = new BaseProto();

/** Set some properties to BaseProtoTestObj **/

function cb1 ( key, val ) {
    var prop;

    key = key.toString() + " Callbacked";
    val = val.toString() + " Callbacked";

    for (prop in this) {
        this[prop] = this[prop].toString() + " Callbacked";
    }
}

// Doesn't have any effect on BaseProtoTestObj
BaseProtoTestObj.each(cb1);

我可以看到jQuery的.each()中还有很多内容,但我可以从中收集它以进行优化,并能够迭代数组和对象。

最后,我的问题很简单。 jQuery在影响属性方面做了什么,我不在.each()


修改

我想另一个问题是,如果我的逻辑基本上是错误的,并且你不能以这种方式修改对象的属性。

1 个答案:

答案 0 :(得分:2)

您不需要自定义方法:

for(var prop in object) {
   var value = object[prop];
   // do something with value and/or prop
}

虽然如果你真的需要.each(),你可以这样做:

Object.prototype.each = function(cb) {
    for(var propName in this) {
        cb(propName, this[propName]);
    }
}

var foo = { prop: 'value', prop2: 'value2' };
foo.each(function(key,value) {
    // do something here
});    

由于您需要修改属性的实际值,请尝试以下操作:

Object.prototype.mutate = function(cb) {
    for(var propName in this) {
        this[propName] = cb(propName, this[propName]);
    }
}

var obj = {
    a: 'foo',
    b: 'bar',
    c: 'baz'
};

obj.mutate(function(propName, propValue) {
    return propName + '-' + propValue;
});

/*
obj will now be:

var obj = {
    a: 'a-foo',
    b: 'b-bar',
    c: 'c-baz'
};
*/