prototype chain


السلام عليكم و رحمه الله تعالى و بركاته

فى جافاسكربت كل شىء مشتق من Object ، على سبيل المثال Array و Math و Function و RegExp و String … الخ ،  كلها ترث كل وظائف و خصائص ال Object.prototype و تزيد عليه بخصائص و وظائف خاصه بنوعها ، حتى نتأكد من ذلك سنختبر بعض الخصائص من Array بإستخدام الوظيفه hasOwnProperty التى توضح هل هذه الخاصيه فى بنيه الكائن ام موروثه من كائن اخر كما يوضح الكود البسيط التالى :

alert(Array.hasOwnProperty("push")); // true
alert(Array.hasOwnProperty("constructor")); // false
alert(Array.hasOwnProperty("toSting")); // false
alert(Object.prototype.hasOwnProperty("toString")); // true
alert(Object.prototype.hasOwnProperty("toSource")); // true
  

ال Array ترث constructor و toString و toSource من ال Object و تستطيع استخدامهم كما يوضح الكود التالى :

var arr = [0,1,2];
arr.push(3);
alert(arr.constructor); // Array
alert(arr.toString()); // 0,1,2,3
alert(arr.toSource()); // [0,1,2,3]

الوظيفه push داخل بنيه Array ولا ترثها ، اما عند استدعاء constructor فإنها تبحث عنه داخل Array فلا تجده ثم تبحث عنه فى Object.prototype و تجده ، و من هنا جاء الاسم prototype chain ، و هو بحث الكائن عن وظيفه او خاصيه داخلها ثم داخل سلسله الكائنات التى ترث منها ان لم تكن تملك الوظيفه او الخاصيه ، الكائنات الذى ينشأها المطور تتبع نفس القواعد السابقه كما يوضح المثال البسيط التالى :

function Person(){ // Person function constructor
this.has = "brain";
/* code */
}

function Programmer(){ // Programmer function constructor
this.can = "use my brain";
/* code */
}

الخطوه التاليه أن اجعل Programmer يرث من Person كما يوضح الكود التالى :

Programmer.prototype = new Person(); // Programmer inherit Person
Programmer.prototype.constructor = Programmer; // set the constructor back

الخطوه الاخيره هى استخدام و فحص Programmer كما يوضح الكود البسيط التالى :

var i = new Programmer();
alert(i.has); // brain
alert(i.can); // use my brain
alert(i.constructor); // Programmer

من الكود السابق نستنتج ان الكائن i الذى تم انشاءه من Programmer يستطيع استخدام الخاصيه has الموروثه من Person و الخاصيه constructor الموروثه من Object و بالطبع الخاصيه can التى فى بنيه Programmer ، و لزياده التأكيد على الكلام السابق نستطيع استخدام hasOwnProperty لمعرفه الخصائص الموروثه من الخصائص الموجوده فى بنيه الكائن :

alert(i.hasOwnProperty("can")); // true 
alert(i.hasOwnProperty("has")); // false (inherited)
alert(i.hasOwnProperty("constructor")); // false (inherited)

بالمناسبه الوظيفه hasOwnProperty موروثه من Object هههههه😀 .

ماذا اذا اردت معرفه خواص كائن معين عن طريق for … in ، هل الخصائص الموروثه ستنتج منها ايضا ؟ انظر للكود التالى :

for(var x in i){
    alert(x);
}
// can, has, constructor

ينتج عن الكود السابق الخصائص الموروثه و الغير موروثه ، و للحصول على الخصائص الغير الموروثه فقط يمكننا استخدام شرط hasOwnProperty كما يوضح الكود التالى :

for(var x in i){
    if(i.hasOwnProperty(x)) alert(x);
}
// can 

و للحصول على الخصائص الموروثه فقط كما يوضح الكود البسيط التالى سوف نعكس الشرط :

for(var x in i){
    if(! i.hasOwnProperty(x)) alert(x);
}
// has, constructor

تمت اضافه هذا الدرس لسلسله درووس OOP JS لاهميته يا ناس .

الأوسمة: ,

3 تعليقات to “prototype chain”

  1. almahjer Says:

    لاهميته يا ناس؟ههههههه
    شكرا جزيلا بارك الله فيك عاشق الجافاسكرت
    تحياتي لك

  2. mostafa farghaly Says:

    الشكر لله يا مهاجر ، يسعدنى كثيرا رؤيه تعليقاتك😀 .

  3. لؤى نجاتى Says:

    موضوع متقدم و جهد تشكر عليه…

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s


%d مدونون معجبون بهذه: