Как обернуть литерал объекта javascript в оболочку YUI Object? - PullRequest
0 голосов
/ 07 сентября 2011

Хорошо, я знаю, что это глупый вопрос, и на глупые вопросы чаще всего труднее всего найти ответы, так как все предполагают, что они только что известны. Во всяком случае, у меня есть это:

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) {
} );

Стоит отметить, что исходный объект может быть передан в качестве аргумента, поэтому я не всегда буду их конструировать. Другими словами, я действительно хочу обернуть один (и таким способом, который не будет двойной оберткой, если она уже обернута). Ответ, вероятно, очевиден, и даже в документации я просто не могу его найти. Так я через себя на милость гуглсферы ...

--------------------- РЕДАКТИРОВАТЬ --------------------

Когда я говорю «обернуть», я думаю, что я имею в виду (на языке 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), я могу использовать собственные реализации без изменения кода. Я думаю, что вторая причина - это то, что Крокфорд, похоже, подчеркивает, поскольку он всегда говорит, что если вы хотите добавить функцию к прототипу объекта, сделайте это таким образом, чтобы проверить, определена ли функция уже перед выполнением. так. Не стесняйтесь исправлять меня, если я ошибаюсь где-то выше, и, как всегда, не стесняйтесь предложить решение:)

1 Ответ

0 голосов
/ 07 сентября 2011

Насколько я знаю, 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/.

...