好吧,我知道这是一个愚蠢的问题,而愚蠢的问题通常是最难找到答案的,因为每个人都认为它们是已知的。总之,我有这个:
var map = {
"key1" : "someValue1",
"key2" : "someValue2"
};
然后我这样列举条目:
Y.Object.each( map, function(value,key,object) {
// do something;
} );
但是我真正想做的是:
map = Y.Object.wrap(map);
map.each( function(value,key,object) {
} );
值得注意的是,原始对象可以作为实参传入,所以我不会总是构造它们。换句话说,我确实想要包装一个(并且在一种方式下,如果它已经包装好了,就不会再次包装)。答案可能是显而易见的,甚至在文档中,我只是找不到它。所以我只能任由谷歌的摆布……
--------------------- 编辑 --------------------
当我说wrap时,我猜我的意思是(在YUI语言中)扩增。换句话说,我希望Y.Object方法可以直接在有问题的对象上使用。例如,我希望能够做这样的事情:
var map = {
"key1" : "someValue1",
"key2" : "someValue2"
};
map.each( function(value,key,object) {
//do something with each entry in my map
} );
不必总是这样做:
var map = {
"key1" : "someValue1",
"key2" : "someValue2"
};
Y.Object.each( map, function(value,key,object) {
//do something with each entry in my map
} );
有两个原因。首先,我很懒,当我只想遍历对象的每个属性时,我不想一直键入Y.Object.each( myObject...
。其次,我想要向前兼容,这样当功能each
和some
得到原生定义时(我认为它们已经在firefox和chrome中),我可以利用原生实现而无需更改代码。我认为第二个原因是Crockford似乎强调的,因为他似乎总是说,如果你想向对象的原型添加一个函数,那么在这样做之前,要先检查函数是否已经定义。如果我在以上任何地方错了,请随时纠正我,并且一如既往,请随时提出解决方案:)
据我所知,YUI3没有适用于常规对象的包装函数,并为它们添加了所需的each()
方法。但是,你可以像这样创建自己的:
YUI().use('node', function(Y) {
// code to declare our new wrapper function
function myWrap(o) {
if (o instanceof myIterator) return(o); // don't double wrap
return(new myIterator(o));
}
// code to declare a base class used in the iterator
function myIterator(o) {
Y.mix(this, o);
}
// the actual each() iteration function
myIterator.prototype.each = function(fn) {
var key;
for (key in this) {
if (this.hasOwnProperty(key)) {
fn.call(this, this[key], key, this);
}
}
}
// start of regular code that uses the new wrapper
var map = {
"key1" : "someValue1",
"key2" : "someValue2"
};
var x = myWrap(map);
x.each(function(value, key, object) {
console.log(value);
});
});
您可以在这里看到它的工作原理:http://jsfiddle.net/jfriend00/h7Fpp/.