تشارك هذه المقالة النسخة الضحلة ورمز النسخ العميقة لكائنات JavaScript للرجوع إليها. المحتوى المحدد كما يلي
1. نسخة الضوء
النسخة تعني نسخ جميع خصائص الكائن الأصل إلى كائن الطفل.
الوظيفة التالية نسخ:
var invalue = {nation: 'China'} var doctor = {career: 'doctor'} function extendcopy (p) {var c = {} ؛ لـ (var i in p) {c [i] = p [i] ؛ } c.Uber = p ؛ العودة ج. }عند استخدامه ، اكتب هذا:
var doctor = extendcopy (صينية) ؛ دكتور. // الصين
ومع ذلك ، هناك مشكلة في مثل هذه النسخة. أي إذا كانت خاصية الكائن الأصل تساوي صفيفًا أو كائنًا آخر ، فحينئذٍ يحصل الكائن الطفل على عنوان ذاكرة فقط ، وليس نسخة حقيقية ، لذلك هناك احتمال أن يتم العبث به.
يرجى الاطلاع ، الآن إضافة خاصية "مسقط رأس" إلى الصينيين ، والتي تعد قيمتها صفيفًا.
صيني.
من خلال وظيفة ExtendCopy () ، يرث الطبيب الصينية.
var doctor = extendcopy (الصينية) ؛
ثم نضيف مدينة إلى "مكان ميلاد" الطبيب:
doctor.birthplaces.push ('xiamen') ؛
تحقق من نتائج الإدخال
تنبيه (doctor.birthplaces) ؛ // بكين ، شنغهاي ، هونغ كونغ ، شيامن
تنبيه (صينية. birthplaces) ؛ // بكين ، شنغهاي ، هونغ كونغ ، شيامن
نتيجة لذلك ، تم تغيير كلا الأماكن.
لذلك ، تمدد copy () فقط نسخ بيانات النوع الأساسي ، ونحن نسمي هذه النسخة "نسخة ضحلة".
2. نسخة عميقة
لأن النسخة الضحلة والعميقة لها مثل هذه العيوب ، دعونا نلقي نظرة على النسخة العميقة بعد ذلك
ما يسمى "نسخة عميقة" يعني أنها يمكن أن تدرك نسخة حقيقية من المصفوفات والكائنات. تنفيذها ليس صعبًا ، فقط استدعاء "نسخة ضحلة" بشكل متكرر.
وظيفة deepcopy (p ، c) {var c = c || {} ؛ لـ (var i in p) {if (typeof p [i] === 'Object') {c [i] = (p [i] .Constructor === array)؟ []: {} ؛ deepcopy (p [i] ، c [i]) ؛ } آخر {c [i] = p [i] ؛ }} return c ؛ }ألق نظرة على كيفية استخدامه:
var doctor = deepcopy (الصينية) ؛
الآن ، أضف خاصية إلى الكائن الأصل مع القيمة كصفيف. ثم ، قم بتعديل هذه الخاصية على كائن الطفل:
صيني. // Beijing ، Shanghai ، Hong Kong ، Xiamen Alert (inchaning.birthplaces) ؛ // بكين ، شنغهاي ، هونغ كونغ
هذا يكمل النسخة.
$ .extend ()
$ .extend () في jQuery هو نفسه.
$ .extend ([Deep] ، Target ، Object1 [، Objectn])
•عميق
النوع: منطقية
إذا كان هذا صحيحًا ، يصبح الدمج متكررًا (يسمى أيضًا نسخة عميق).
•هدف
النوع: كائن
تمديد الكائن. هذا سوف يتلقى عقارات جديدة.
• Object1
النوع: كائن
كائن يحتوي على خصائص إضافية تم دمجها في المعلمة الأولى.
• Objectn
النوع: كائن
يحتوي على سمات إضافية للاندماج في المعلمة الأولى
عندما نقدم كائنين أو أكثر إلى $ .extend () ، تتم إضافة جميع خصائص الكائن إلى الكائن الهدف (المعلمة الهدف).
إذا تم توفير معلمة واحدة فقط إلى $ .extend () ، فهذا يعني أن المعلمة الهدف قد تم حذفها. في هذه الحالة ، يتم تخلف كائن jQuery نفسه إلى الكائن الهدف. وبهذه الطريقة ، يمكننا إضافة ميزات جديدة تحت مساحة اسم jQuery. هذا مفيد لمطوري المكونات الإضافية عندما يرغبون في إضافة وظائف جديدة إلى jQuery.
تذكر أنه سيتم تعديل الكائن المستهدف (المعلمة الأولى) وسيتم إرجاعه عبر $ .extend (). ومع ذلك ، إذا أردنا الاحتفاظ بالكائن الأصلي ، فيمكننا تمرير كائن فارغ ككائن هدف:
var object = $ .Extend ({} ، Object1 ، Object2) ؛
بشكل افتراضي ، فإن عملية الدمج عبر $ .Extend () ليست متكررة ؛ إذا كانت خاصية الكائن الأول نفسه كائنًا أو صفيفًا ، فسيتجاوز خاصية تمامًا بنفس المفتاح للكائن الثاني. لن يتم دمج هذه القيم. يمكن فهم ذلك عن طريق التحقق من قيمة الموز في المثال أدناه. ومع ذلك ، إذا تم استخدام True كوسيطة أولى للوظيفة ، فسيتم تنفيذ الدمج العودية على الكائن.
تحذير: لا يتم دعم تمرير خطأ للمعلمة الأولى.
1. دمج كائنين وتعديل الكائن الأول.
var object1 = {Apple: 0 ، banana: {الوزن: 52 ، السعر: 100} ، الكرز: 97} ؛ var object2 = {banana: {price: 200} ، durian: 100} ؛ ) ؛ // {"Apple": 0 ، "Banana": {"Price": 200} ، "Cherry": 97 ، "Durian": 100}2. دمج كائنين بطريقة متكررة وتعديل الكائن الأول.
var object1 = {Apple: 0 ، banana: {الوزن: 52 ، السعر: 100} ، الكرز: 97} ؛ var object2 = {banana: {price: 200} ، durian: 100} ؛ json.stringify (Object1)) ؛ // {"Apple": 0 ، "Banana": {"Weight": 52 ، "Price": 200} ، "Cherry": 97 ، "Durian: 100}3. دمج الكائنات الافتراضية والخيارات ولا تعدل كائن الافتراضيات. هذا هو نموذج تطوير المكونات الشائعة الاستخدام.
var defaults = {validate: false ، limit: 5 ، name: "foo"} ؛ var reports = {validate: true ، name: "bar" ؛ )تحدد JavaScript ما إذا كانت الكائنات متساوية
في JavaScript ، تشمل عمليات المساواة "==" ، "===" الاتساق. ليست هناك حاجة إلى أن تكون غالبية الاختلافات بين الاثنين. في هذه المقالة ، سوف نتحدث عن كيفية تحديد ما إذا كان كائنين متساوين؟ قد تعتقد أنه إذا كان للكائنين نفس الخصائص وخصائصهما لها نفس القيم ، فإن الكائنين متساويان. ثم دعونا نستخدم مثالًا لإظهار:
var obj1 = {name: "benjamin" ، الجنس: "ذكر"} var obj2 = {name: "benjamin" ، sex:من المثال أعلاه ، يمكننا أن نرى ما إذا كنت تستخدم "==" أو "==" ، يتم إرجاع خطأ. السبب الرئيسي هو أن سلسلة الأنواع الأساسية والرقم تتم مقارنتها بالقيم ، في حين تتم مقارنة الكائنات (التاريخ ، الصفيف) والكائنات العادية من خلال العنوان في الذاكرة المشار إليها بواسطة المؤشرات. انظر المثال التالي:
var obj1 = {name: "benjamin" ، الجنس: "ذكر"} ؛ var obj2 = {name: "benjamin" ، الجنس: falseconsole.log (obj2 === OBJ3) ؛ // المخرجات: falseconsole.log (OBJ2 === OBJ3) ؛يرجع المثال أعلاه بشكل صحيح لأن مؤشرات OBJ1 و OB3 تشير إلى نفس العنوان في الذاكرة. إنه مشابه لمفهوم القيمة المتمثلة في تمرير ومرجع في اللغات الموجهة للكائنات (Java/C ++). لأنه ، إذا كنت ترغب في تحديد ما إذا كان كائنين متساويين ، فيجب أن تكون واضحًا ، هل تحاول تحديد ما إذا كانت خصائص الكائنين متماثلة ، أو ما إذا كانت القيم المقابلة للخصائص متشابهة أم ماذا؟
وظيفة الشخص (الاسم) {this.name = name ؛ } var p1 = شخص جديد ("p1") ؛ var p2 = شخص جديد ("p2") ؛ console.log (p1 == p2) ؛ // false person.prototype.sayhi = function () {// do sayhi هنا} console.log (p1.sayhi () == p2.sayhi ()) ؛ // true console.log (p1.sayhi () == p2.sayhi ()) ؛ // true console.log (p1.sayhi () === p2.sayhi ()) ؛ //حقيقيما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.