我正在使用一些辅助方法在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()
?
修改
我想另一个问题是,如果我的逻辑基本上是错误的,并且你不能以这种方式修改对象的属性。
答案 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'
};
*/