यह प्रोटोटाइप के एक्सटेंशन बनाने के लिए अनुशंसित नहीं है, यह उन मुद्दों के परिणामस्वरूप होगा जब आप अपने कोड / घटकों पर परीक्षण करेंगे। इकाई परीक्षण चौखटे स्वचालित रूप से आपके प्रोटोटाइप एक्सटेंशन को नहीं मानेंगे। तो यह एक अच्छा अभ्यास नहीं है। यहां प्रोटोटाइप एक्सटेंशन के अधिक स्पष्टीकरण हैं क्यों देशी वस्तुओं को एक बुरी प्रथा का विस्तार किया जा रहा है?
जावास्क्रिप्ट में वस्तुओं को क्लोन करने के लिए एक सरल या सीधा तरीका नहीं है। यहां "Shallow Copy" का उपयोग करके पहला उदाहरण दिया गया है:
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));
गहरे क्लोन के साथ संबोधन के संदर्भ रखे जाएंगे। हालांकि डीपक्लोन प्रोटोटाइप को बंद कर दिया जाएगा, इसलिए डीपक्लोन.लॉगफुलनाम () काम नहीं करेगा।
3 -> 3 पार्टी पुस्तकालय:
एक अन्य विकल्प लोडशेड या अंडरस्कोर जैसी 3 पार्टी पार्टी लाइब्रेरी का उपयोग करेगा। वे एक नई वस्तु का निर्माण करेंगे और प्रत्येक मूल्य को मूल से नई वस्तु में कॉपी करते हैं, जो कि उनके संदर्भों को स्मृति में रखते हैं।
अंडरस्कोर: चलो क्लोनडॉर्स्कोर = _ (मूल) .clone ();
लोडश क्लोन: var cloneLodash = _.cloneDeep (मूल);
लॉश या अंडरस्कोर के नकारात्मक पहलू को आपकी परियोजना में कुछ अतिरिक्त पुस्तकालयों को शामिल करने की आवश्यकता थी। हालांकि वे अच्छे विकल्प हैं और उच्च प्रदर्शन परिणाम भी देते हैं।