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



好吧,我知道这是一个愚蠢的问题,而愚蠢的问题通常是最难找到答案的,因为每个人都认为它们是已知的。总之,我有这个:

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...。其次,我想要向前兼容,这样当功能eachsome得到原生定义时(我认为它们已经在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/.

最新更新