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

我正在用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); }; 

问题是,虽然callback肯定是被解雇的,但对对象的属性没有任何影响。 不pipe我在callback中做什么,所做的更改都停留在callback的范围内。

这是一个简单的callback,我一直在testing的例子。

 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()


编辑

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

你不需要一个自定义的方法:

 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' }; */