В JavaScript все назначения между переменными объекта передаются через адреса. Некоторые студенты могут спросить, какие объекты являются. Было бы лучше привести пример:
Кода -копия выглядит следующим образом:
typeof (true) // "Boolean"
typeof (1) // "номер"
typeof ("1") // "строка"
typeof ({}) // "объект"
typeof ([]) // "Объект"
typeof (null) // "объект"
typeof (function () {}) // "function"
Таким образом, на самом деле объект, который нам нужно иметь дело с углубленным копированием, является объектом объекта, а объекты, не являющиеся объектами, просто назначаются напрямую и нормально. Моя идея реализации глубокой репликации JS:
Итерация через все свойства этого объекта,
Если свойство «объект», требуется специальная обработка.
Если этот объект объект является особенным и является массивом, то создайте новый массив и глубоко скопируйте элементы в массиве.
Если этот объект объекта является объектом без ареста, то просто вызовите метод глубокой копии рекурсивно на нем.
Если это не «объект», просто скопируйте его обычно.
Вот моя реализация:
Кода -копия выглядит следующим образом:
Object.prototype.deepcopy = function () {
var obj, я;
obj = {};
для (атрит в этом) {
if (this.hashownproperty (attr)) {
if (typeof (this [attr]) === "Object") {
if (this [attr] === null) {
obj [attr] = null;
}
else if (object.prototype.tostring.call (this [attr]) === '[object array]') {
obj [attr] = [];
for (i = 0; i <this [attr] .length; i ++) {
obj [attr] .push (this [attr] [i] .deepcopy ());
}
} еще {
obj [attr] = this [attr] .deepcopy ();
}
} еще {
obj [attr] = this [attr];
}
}
}
вернуть OBJ;
};
Если браузер поддерживает Ecmascript 5, вы можете использовать его, чтобы глубоко скопировать все функции свойств объекта
Кода -копия выглядит следующим образом:
Object.DefineProperty (obj, attr, object.getownpropertydescriptor (this, attr));
Заменить
Кода -копия выглядит следующим образом:
obj [attr] = this [attr];
Преимущество реализации этого метода непосредственно на Object.Prototype заключается в том, что все объекты наследуют метод. Недостаток заключается в том, что некоторые библиотеки также переписывают объекты объектов, поэтому иногда возникают конфликты. На это нужно обратить внимание на. Конкретный метод использования следующим образом:
Кода -копия выглядит следующим образом:
Object.prototype.deepcopy = function () {...}
var a = {x: 1};
var b = a;
var c = a.deepcopy ();
топор = 2;
bx = 3;
console.log (ax); // 3
console.log (bx); // 3
console.log (cx); // 1
Вышесказанное объяснение о глубокой репликации. Однако, так как мы говорили о глубокой репликации сегодня, мы хотим, чтобы она была соответствующей мелкой репликацией соответственно. Давайте кратко суммируем сходства и различия между ними.
Мелкая копия (теневая клонирование): только скопируйте основной тип объекта, а тип объекта по -прежнему принадлежит исходной ссылке.
Глубокая копия (глубокое клонирование): он не копирует базовый класс объекта, но также копирует объекты в исходном объекте. То есть он полностью генерируется новым объектом.