好的,我知道这是一个愚蠢的问题,愚蠢的问题通常是最难找到答案的,因为每个人都认为他们只是知道。无论如何,我有这个:
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) {
} );
值得注意的是,原始对象可以作为参数传递,因此我不会总是构造它们。换句话说,我真的想要包装一个(并且如果它已经被包装,那么它将不会双重包装)。答案很明显,即使在文档中,我也无法找到它。所以我完全依靠googlesphere的摆布......
---------------------编辑--------------------
当我说换行时,我想我的意思是(在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似乎强调的一点,因为他似乎总是说如果你想在Object的原型中添加一个函数,那么这样做会检查函数是否已经定义所以。如果我上面的任何地方出错了,请随时纠正我,并且一如既往地随意提出解决方案:)
答案 0 :(得分:0)
据我所知,YUI3没有适用于常规对象的wrap函数,并为它们添加了所需的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/。