Не рекомендується робити розширення прототипу, це призведе до проблем, коли ви будете проводити тести свого коду / компонентів. Фреймворки модульного тесту не приймають автоматично ваші розширення прототипу. Тож це не є доброю практикою. Тут є більше пояснень розширень прототипів. Чому розширення власних об’єктів є поганою практикою?
Клонувати об'єкти в JavaScript існує не простий і нехитрий спосіб. Ось перший екземпляр із використанням "Дрібної копії":
1 -> Неглибокий клон:
class Employee {
constructor(first, last, street) {
this.firstName = first;
this.lastName = last;
this.address = { street: street };
}
logFullName() {
console.log(this.firstName + ' ' + this.lastName);
}
}
let original = new Employee('Cassio', 'Seffrin', 'Street A, 23');
let clone = Object.assign({},original);
let cloneWithPrototype Object.create(Object.getPrototypeOf(original)), original)
let clone2 = { ...original };
clone.firstName = 'John';
clone.address.street = 'Street B, 99';
Результати:
original.logFullName ():
результат: Кассіо Сеффрін
clone.logFullName ():
результат: Джон Сеффрін
original.address.street;
результат: 'Вулиця Б, 99' // зауважте, що початковий під об'єкт змінено
Зверніть увагу: Якщо екземпляр має закриття як власні властивості, цей метод не оберне його. ( читайте більше про закриття ). Крім того, додатковий об’єкт "адреса" не буде клонованим.
clone.logFullName ()
не буде працювати.
cloneWithPrototype.logFullName ()
буде працювати, оскільки клон також копіює свої Прототипи.
Щоб клонувати масиви за допомогою Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Клонувати масив із використанням розподіленого синтаксису ECMAScript:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Глибокий клон:
Щоб заархівувати абсолютно нове посилання на об'єкт, ми можемо використовувати JSON.stringify () для синтаксичного аналізу вихідного об'єкта як рядка, а після синтаксичного аналізу його назад до JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
При глибокому клонуванні посилання на адресу зберігатимуться. Однак прототипи deepClone будуть втрачені, тому deepClone.logFullName () не буде працювати.
3 -> 3-ті партійні бібліотеки:
Іншими варіантами буде використання сторонніх бібліотек, таких як loadash або підкреслення. Вони створюють новий об'єкт і копіюють кожне значення з оригіналу на новий об'єкт, зберігаючи його посилання в пам'яті.
Підкреслення: нехай cloneUnderscore = _ (оригінал) .clone ();
Клон завантаження: var cloneLodash = _.cloneDeep (оригінал);
Недоліком лодаша або підкреслення була необхідність включити додаткові бібліотеки у свій проект. Однак вони є хорошими варіантами, а також дають високі результати.