如何在YUI对象包装器中包装javascript对象文字?

时间:2011-09-07 16:06:47

标签: javascript object yui

好的,我知道这是一个愚蠢的问题,愚蠢的问题通常是最难找到答案的,因为每个人都认为他们只是知道。无论如何,我有这个:

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...。其次,我想要向前兼容,以便当函数eachsome本地定义时(我认为它们已经在firefox和chrome中)我可以利用本机实现而无需更改代码。我认为第二个原因是Crockford似乎强调的一点,因为他似乎总是说如果你想在Object的原型中添加一个函数,那么这样做会检查函数是否已经定义所以。如果我上面的任何地方出错了,请随时纠正我,并且一如既往地随意提出解决方案:)

1 个答案:

答案 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/