Общий Javascript метод clone(), используемый в приложении GWT
Я пытался написать общую функцию клонирования, которая должна была бы выполнять настоящее глубокое клонирование. Я наткнулся на эту ссылку, Как Deep клонировать в 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")
линия.
Пожалуйста, помогите.
PS: я пытаюсь получить общий метод клонирования, который можно использовать для клонирования любого объекта.
1 ответ
Прототипированные объекты GWT не имеют метода forEach; они не наследуют стандартные прототипы объектов javascript, так как они должны действовать как объекты java, а не объекты javascript.
Возможно, вы могли бы обойтись без Object.prototype.forEach.call(item, function(){})