Общий метод clone() Javascript, используемый в приложении GWT

Я пытался написать общую функцию клонирования, которая должна иметь возможность выполнять настоящее глубокое клонирование. Я наткнулся на эту ссылку, Как глубоко клонировать в javascript и взял функция оттуда.

Этот код работает очень хорошо, когда я пытаюсь использовать прямой Javascript. Я внес небольшие изменения в код и попытался вставить код JSNI в GWT.

функция клонирования:

deepCopy = function(item)
{
    if (!item) {
        return item;
    } // null, undefined values check

    var types = [ Number, String, Boolean ], result;

    // normalizing primitives if someone did new String('aaa'), or new Number('444');
    types.forEach(function(type) {
        if (item instanceof type) {
            result = type(item);
        }
    });

    if (typeof result == "undefined") {
        alert(Object.prototype.toString.call(item));
        alert(item);
        alert(typeof item);
        if (Object.prototype.toString.call(item) === "[object GWTJavaObject]") {
            alert('1st');
            result = [];
            alert('2nd');
            item.forEach(function(child, index, array) {//exception thrown here
                alert('inside for each');
                result[index] = deepCopy(child);
            });
        } else if (typeof item == "GWTJavaObject") {
            alert('3rd');

            if (item.nodeType && typeof item.cloneNode == "function") {
                var result = item.cloneNode(true);
            } else if (!item.prototype) { 
                result = {};
                for ( var i in item) {
                    result[i] = deepCopy(item[i]);
                }
            } else {
                if (false && item.constructor) {
                    result = new item.constructor();
                } else {
                    result = item;
                }
            }
        } else {
            alert('4th');
            result = item;
        }
    }

    return result;
}

И список, который я передаю этой функции, выглядит так:

List<Integer> list = new ArrayList<Integer>();
        list.add( new Integer( 100 ) );
        list.add( new Integer( 200 ) );
        list.add( new Integer( 300 ) );

        List<Integer> newList = ( List<Integer> ) new Attempt().clone( list );

        Integer temp = new Integer( 500 );
        list.add( temp );

        if ( newList.contains( temp ) )
            Window.alert( "fail" );
        else
            Window.alert( "success" );

Но когда я выполняю это, я получаю исключение нулевого указателя в функции клонирования сразу после строки alert("2nd").

Пожалуйста, помогите.

P.S: Я пытаюсь получить здесь общий метод клонирования, который можно использовать для клонирования любого объекта.


person LPD    schedule 11.01.2013    source источник
comment
возможный дубликат глубокого клонирования в GWT   -  person Anders R. Bystrup    schedule 11.01.2013


Ответы (1)


Объекты-прототипы GWT не имеют метода forEach; они не наследуют стандартные прототипы объектов javascript, поскольку предполагается, что они действуют как объекты java, а не объекты javascript.

Возможно, вам сойдет с рук Object.prototype.forEach.call(item, function(){})

person Ajax    schedule 11.01.2013