concepts_of_programming_lec_7
بسم الله الرحمن الرحيم، اللهم اشرح لي صدري ويسر لي أمري واحلل عقدة من لساني يفقهوا قولي. ازيكم يا شباب عاملين ايه؟ 
دي Lecture 7 concepts، دي أول Lecture بعد الـ Midterm. طبعاً الـ Midterm بصراحة كان جاي لذيذ يعني مكنش جاي صعب، وسواء عكيت أو معكيتش يعني حاول إن أنت تشد في اللي جاي يعني، المادة عموماً مش صعبة.
وفيها عملي فالعملي ده مكان تجميع درجات شوية يعني. والـFinal بتاع دكتور محمد مبروك دايما بيجي سهل بصراحة. محدش يقلق يعني وبإذن الله ايه اه تعدوا كلكم يعني. طبعًا تنويه بصيب بخصوص الـMidterm. هو اي حد عملها 12.0 او 12 الدكتور قال هيحسب الاتنين صح. مع ان الناتج الصح مفروض يعني ان هو يبقى 12.0 لان هو في الـ Fold-left  كان عاملها 0.0 مش 0 بس
فتعالوا ندخل كده في المحاضرة، طبعاً دي أول محاضرة على الـ JavaScript بس يعني هي أول محاضرة على الـ JavaScript وآخر محاضرة. هي محاضرة واحدة على الـ JavaScript بس طويلة شوية وفيها نظري كتير، فأنا هحاول أجري النظري عشان هعمل جزء عملي في الآخر كده ف بإذن الله يعني. فتعالوا كده قبل ما نبدأ متنسوش تدعوا لإخوتنا في فلسطين، وأتمنى إن أنت توقف وتدعيلهم بجد يعني عشان هما فعلاً في أمس الحاجة للدعاء.
طبعاً ده الـ Installation بتاع الـ JavaScript اللي هو الـ Interpreter بتاعها الـ Node.js، بتحمله سهل جداً وايه وبتبدأ تكتب على طول يعني. طبعاً أول حاجة هندخل في الـ Static 
والـ Dynamic typed languages، أول حاجة إيه هو الـ Static والـ Dynamic لو تفتكروا كان في سؤال في الـ Midterm كده.
الـ Midterm الفيديو بتاع الـ Midterm اللي هو تقريباً Midterm السنة اللي فاتت أو اللي قبلها، كان بيقول لك Scala هي Static ولا Dynamic؟ أنا كنت محتار يعني هي في
 الـ Answer sheet كانت معمولة Static وأنا كنت بقول إن هي ممكن تنفع Dynamic بس لو جات لي هعملها Static، ممكن تنفع Dynamic ليه؟ لأن أنا كنت بقول إن أنت عندك Variable يعني أنت ممكن تعمله الـ Data type بتاعه Any، و Any ده ممكن يتغير يعني شوية ساعات تقدر تحطه String وساعات تقدر تحطه Integer يعني وهكذا.
بس لما سألت الدكتور هو قال لي لا هي Static وقال لي جواب بصراحة أقنعني،
 قال لي أنت الـ Variable بتاعك هل الـ Data type بتاعه اتغير اللي أنت معرفه وأنت بتكتب؟ يعني أنت عامله Any، هل Any ديت اتغيرت؟ هل هي مبقتش Any؟ هل هي بقت مثلاً Integer؟ الـ Variable بتاعه بقى الـ Data type بتاعه بقى Integer فعلاً مبيقدرش يشيل غير Integer؟
أو كدة يعني أنا قلت له لأ هو Any بس، هو فضل Any زي ما هو، و Any ده اللي بيتشكل يعني بس هو في أثناء الـ Runtime يعني بيفضل Any يعني مبيتغيرش. إنما مثلاً لغة زي الـ JavaScript اللي هي بالمناسبة Dynamic أنت مابتحددش Data Type أصلاً وبتقول له مثلاً let x = 5 شوية كده كمان سطرين تقول له x ديت هتساوي أحمد.
كمان تلات سطور هتقول له x تساوي Object مش هيقول لك لا، هو في كل الحالات دي زي الفل من غير أما أنت تغير حتى في الـ يعني الـ x ديت فضلت زي ما هي ما أنت مغيرتش فيها أي حاجة، هو Variable بيقبل أي Data type جواه وخلاص مبيقولكش لا. بالمناسبة ديت من أكبر المشاكل يعني اللي في الـ JavaScript.
هي مشكلة يعني خلتهم يعملوا لغة اسمها TypeScript، اللي هي أصلًا هنكمل بيها الكورس يعني. طبعاً ده الكلام الأساسي يعني في الـ Static والـ Dynamic، أنا بحاول أجري الكلام النظري لأنه فعلاً كتير وفي جزء عملي يعني زي ما قلت هعمله أنا يعني. طبعاً هنا مديك أمثلة، C++ والـ Java والـ Scala دول طبعاً Static، وهو مديك هنا أمثلة على الـ Dynamic، 
PHP و JavaScript.
هو طبعاً كان بيقول لك هنا كلام نظري يعني إيه، بيقول لك يعني إن الـ Dynamic بتخلي
 الـ Programmer يكتب أسرع يعني وبتاع لأن أنت مابتحتاجش إن أنت تعرف Data type وبتاع، مابتشغلش دماغك يعني بتيجي تعمل x هيساوي كذا وخلاص، زي Python تقريباً Python Dynamic برضو أنت بتعمل x هيساوي الـ Value بتاعتك على طول وخلاص.
primitive and complex types in javascript الـprimitives
طبعا ايه الـprimitives؟ الـprimitives هنا في الـjavascript حاجات قليلة جدا حتى حاجات تحسها حاجات كبيرة كدة حاجة شاملة يعني number هو بيشيل أي number بيشيل سواء float بيشيل integer بيشيل أي رقم عادي خالص في string 
string دا طبعا كلنا عارفين الـ strings يعني
فيه Undefined URLدول هنتكلم عليهم كمان شوية وفيه BigInt BigInt ده لسه متضاف في 2020 أنا حتى أصلا ما كنتش أسمع عنه قبل المحاضرة يعني لأن أنا لما كنت مذاكر بصراحة JavaScript كنت مذاكرها على ECMAScript 6
 ECMAScript 6 ديت في 2015 تقريبا أو حوالي زي كده يعني بس ده تقريبا أشهر يعني أشهر version من JavaScript مشهورة لحد الوقت دي تقريبا ECMAScript وصلت أنهاردة لحد
لحد ECMAScript يعني في وقت تسجيل الفيديو ده كانت وhصلة لحد ECMAScript 12  ECMAScript 12 اللي هي بتاعة 2021 تقريباً يعني. بس دايماً لما بتيجي تدور على شرح أو حاجة هتلاقي ECMAScript 6 هي الـ Standard يعني لأن هي كل اللي بعد ECMAScript 6 التغييرات مابتكونش تغييرات جوهرية مش تغييرات تغييرات كبيرة يعني في اللغة. إنما ECMAScript 6 والفرق ما بينها و 5...
فعلاً كان إيه كان فرق كبير جداً يعني. أنا مبصيتش عليها بس كل كل اللي اتعامل يعني كل اللي اتعامل بـ ECMAScript 5 كان بيقول إن هي إيه رخمة شوية عن ECMAScript 6، تحسن يعني ECMAScript 6 خلت اللغة منظمة أكتر شوية وبقى فيها إيه بقى فيها طابع برمجي شوية يعني طابع اللغات اللي إحنا بنتعامل بيها اليومين دول.
آآ يعني ECMAScript ديت كان في دكتور كدة كانت قالت لي يعني إن ECMAScript ديت أصلاً شركة هي اللي عملت الموضوع ده يعني مكنش موجود أصلاً زمان، جمعوا شوية شوية مهندسين كدة من كام شركة وقعدوا يحطوا Rules للغة عشان عشان اللغة كانت مفتحة أوي 
ف ف فبيحصل منها مشاكل كتير.
فعايزين يحطوا بس بس Standard كده عشان إيه أي Programmer يمشي يكتب الـ code بتاعه يعني يبقى تابع للمعايير ديت يعني إيه فعملوا إيه الـ ECMAScript. طبعاً ده شوية كلام نظري يعني مش موجود حتى فالـ Slides. طبعاً ندخل على الـ...
أنا نسيت، المهم يعني ندخل على الـ Data types في الـ JavaScript تاني، 
هو بيقول إن الـ Number بيشيل أي أرقام يعني سواء Integer أو Float، بيشيل برضو
 الـ Double precision بتاعته لحد 64 bit. بيقول لك Number 0 is Boolean،
 الـ Non-zero بـ Boolean true يعني، ده Boolean false، زي الـ C++ كده كان ممكن مثلاً...
تقول if 5، 
if 5 ديت يعني حرفياً كدة if وجوه الـ bracket
 5، دي معناتها إن هي if true يعني عادي، أو if 0، 
if 0 ديت معناتها إن هي إيه false يعني. الـ string هندخل على الـ string عندك، طبعاً أنا عارف إن أنا بتكلم ببطء شوية أنا مش مرتاح أصلاً كدة بس في كذا حد قال لي إيه إن أنت حاول تبطأ شوية من طريقة كلامك، أنا بحب إن أنا أجري بصراحة في الـ slides.
مبحبش أذاكر كلام نظري بـ ببطء كدة لأن هو أغلبة بيبقى كلام نظري محتاج يعني بس بتفهمه كدة وخلاص بتعدي عليه يعني. فلو حد متضايق يسرع الفيديو يعني شوية. الـ Strings، 
الـ String هو طبعاً كلنا عارفين الـ String اللي هو إيه chain of character أو يعني شوية characters كدة محطوطة جنب بعض.
أنا هحاول أجري الكلام ده، لأنه كلام فعلاً سخيف يعني محدش كلنا عارفينه تقريباً. 
الـ BigInt، الـ BigInt بيقولك إن هو بيشيل من الرينج ده، اللي هو -2 ^ 53 ولحد 2^53 
كلهم -1 طبعاً، -1 ده عشان الـ Zero. طبعاً الـ BigInt بيشيل رقم كبير، تقريباً ده أكبر رقم بيقدر يشيله الـ BigInt.
طبعاً اللي أعرفه يعني إن الـ BigInt ده بيشيل أكتر من الـ long long في الـ Java Script -
في الـ C++، 
Undefined Data type، الـ Undefined إحنا قلنا هنتكلم عن الـ Undefined والـ Null، 
الـ Undefined هو...
لو أنت عارف لو أنت مثلاً في الـ C++ رحت عملت إيه int x وبعد كدة جيت cout الـ x،
 cout x ديت هتطلعلك إيه؟ هتلاقيها طلعتلك garbage يعني value كدة إيه يعني مش متوقعة خالص يعني ممكن تطلعلك رقم negative ممكن تطلعلك رقم positive ممكن تطلعلك إيه ئثقخ يعني على حسب الـ compiler بس هي عموماً بتطلع garbage حاجة مش متوقعة فـ أنت لازم تـ Handle ها يعني الموضوع ده.
في الـ JavaScript هو بيطلعلك حاجة اسمها undefined،
 undefined ديت يعني إيه الـ variable بتاعك متعملش منه إيه متعملش جواه أي
 متعملش فيه initialization يعني متتحطش فيه أي value. على عكس الـ null مثلاً، هنيجي نشوف مقارنة ما بينهم سريعة دلوقتي. فـ أنت لما تيجي ولما تيجي تبص على الـ typeof 
الـ variable ده، هو هنا مثلاً عامل لك variable اسمه item، طبعاً أنت بتعرف variable بكلمة let.
و console log ديت بتبـ print، يعني كأنك بتعمل print. فلما ييجي يـ print الـ item هيطلعلك undefined لأن هو مش عامل هيساوي 5 مثلاً مش عامل هيساوي أحمد مش عامل أي حاجة، فهتلاقيه undefined. طب لما نيجي نشوف الـ typeof الـ variable ده هنلاقيه برضه undefined على عكس الـ object ، على عكس الـ null أنا حرقتها يعني، الـ null لما تيجي تـ print لو أنت عامل مثلاً ده هيساوي null...
هو عاملها تحت هنا كده، لما يجي يقولك إن ده هيساوي الـ null فهتلاقي إن الـ item ده طلع
 الـ variable بتاع الـ value بتاعتك بـ null والـ type بتاعه object. طب معنى كده إيه؟ معنى كده إن الـ null دي value بتعملها initialization أو معنى كده إن هي object فأنت بتعمل initialize للـ item بالـ null ده.
إنما الـ undefined فـ أنت لو لو طلعتلك حاجة undefined فأنت تبقى فاهم إن الـ variable ده مش شايل أي حاجة جواه هو فعلاً مش شايل حاجة، إنما الـ null ديت يعتبر حاجة يعني تقدر تقول إن هي حاجة موجودة في حاجة موجودة بس الحاجة ديت فاضية يعني أو إيه هو اللاشيء موجود، إنما الـ undefined ديت فـ حتى اللاشيء ده مش موجود مفيش حاجة خالص جواه فعلاً الـ variable، الـ variable بتاعك ده أنت عامله let item بس مفيش أي حاجة تانية.
وطبعاً دي من إحدى المشاكل يعني اللي في الـ JavaScript اللي هي بتخليك إيه اللي استدعت وجود الـ TypeScript إنهم الـ undefined ديت بتعمل شوية مشاكل كدة في الـ websites وهكذا يعني. هو هنا قاعد يعيد نفس الكلام يعني بس بطريقة نظرية بيقول إن الـ إيه أن الـ..
 إن لو أنت معملتش سواء مع الـ var أو مع الـ val يعني سواء مع الـ var
 sorry الـ var أنا متعود على Scala.
سواء مع الـ var أو مع الـ let الاتنين بيطلعوا undefined و.. أو null object ايه الفرق ما بينهم؟ الفرق مش عايز اذكره دلوقتي لو حد مهتمه عايز يـ search اكتر بس هو الـ let بيروح يجمع كل الـ lets في  الـ code بتاعك ويحطها في اول الـ code خالص لما بيجي يعمله run يعني انما الـ var بتفضل في مكانه فكأنه variable محطوط
لو حد عايز يعرف أكتر يعني ممكن يكلمني private. اللهم صل على النبي، بس هو ده يعتبر الكلام عن الـ undefined والـ null، هو كله قاعد يعيد نفس الكلام حرفياً، أنا مش عارف الدكتور يعني slide ـاته بصراحة حلوة بس فيها رغي كتير يعني. الـ .. هنيجي للفرق ما بين الـ == والـ ===.
الـ double equal والـ triple equal، 
الـ triple equal دي جديدة علينا أول مرة نشوفها، بس بما إن أنت عندك في الـ JavaScript عندك الـ type بتاع الحاجة مبيتحطش، يعني إيه الـ type بتاع الحاجة مبيتحطش؟ إحنا قلنا إن اللغة dynamic فهي أنت ممكن تحط x هيساوي 5 و x هيساوي 5 as character.
فلما أنت عايز تقارن ما بينهم ممكن تقارن بـ equal equal وممكن تقارن بـ triple equal في الـ if statement مثلاً، الـ double equal بتشوفلك هل الـ 5 كـ value بتساوي الـ 5 كـ value سواء هي integer أو سواء هي string يعني إيه الكلام ده؟ يعني لو إحنا مثلاً قلنا إيه تعالى كدة نكتب فوق...
لو إحنا قلنا 5 == 5 كدة هيقول لك إيه؟ هيقول لك دي true مع إنها حاجة غريبة، لما تيجي تحطله كمان = كدة هيقولك false ليه؟ كمان = كدة false فهو بيقارن الـ value
 والـ data type كمان. الموضوع ممكن يكون غريب شوية وعلى فكرة بتيجي عليها مسائل كتير tricky في الـ interviews يعني أنا شفتلها شفت كذا interview يعني بيسألوا فيها.
فلو حد يعني مهتم مثلاً بالـ JavaScript أو كدة يركز في الموضوع ده. فهو هنا مثلاً بيقارن ما بين 10 و10، فـ ديت هتطلع true وديت هتطلع false، طب مع إن ديت string اللي هي الـ var1 ده string والـ var2 ده إيه ده رقم يعني عادي.
هنا بيدخل على حاجة اسمها الـ Complex data type في الـ JavaScript،
 الـ Complex data type في الـ JavaScript هو بيتكلم على الحاجات اللي هي الـ Array، أي أي حاجة ما هياش الـ Primitive يعني من الآخر، أي حاجة ماهياش primitive سواء الـ Array سواء الـ Objects اللي إحنا كنا إيه اللي إحنا بنعملها من class أو حاجة زي كدة.
وهنيجي كلام عن الـ OOP يعني كمان شوية. هو هنا مثلاً طبعاً حتى في الـ Array يعني اللغة اللغة يعني مفتحة بطريقة مش عايز أقول طريقة مقرفة بس هي بطريقة فعلاً بتعمل مشاكل، يعني أنا عن نفسي بصراحة بحبها يعني أنا عن نفسي بحب أتعامل بالـ JavaScript كتير، 
بس الطريقة ديت بتعمل مشاكل كتيرة يعني إن أنت مثلاً عندك الـ Array بيشيل أي حاجة، يعني الـ Array في الـ C++ مثلاً معروف Array of integer يعني حتى وأنت بتـ declare 
الـ Array بتقوله الـ Data type بتاع الحاجات اللي هيشتغل..
هنا لا، هو هنا بيقولك إيه Array وخلاص يا بابا اديني جواه أي حاجة أنا مش هقولك لأ، 
يعني هو حتى حاططلك هنا إيه integer و string و boolean وما قالش أي حاجة خالص.
 لما تيجي تـ print الـ Array ده هيروح يعملك print للـ للـ brackets يعني كل حاجة جوه الـ brackets ديت، ولما تيجي تقول له typeof هيقولك object لأن ده object بيشيل جواه أي حاجة وخلاص.
هو هنا حتى حاططها في الـ Output، تعالوا ندخل.. هو هنا بيقولك نفس الكلام بيقول إن الـ 
خلي بالك إن الـ Array بتشيل أي value ما بتقولش لأ، حطيت حتى ينفع تحط فيها إيه objects أنت اللي عاملها يعني objects من class ـات أنت عاملها. هنا هيدخل يعتبر في الـ OOP، هنا بداية الكلام التقيل شوية يعني.
أو مش تقيل يعني بس بس بإذن الله هنركز عليه وهنفهمه كويس في العملي يعني،
 لما اجي أطبق بإيدي كدة هتفهم بإذن الله يعني كويس. دخل على الـ class في
 الـ JavaScript، طبعاً هي الـ JavaScript هو بيقول إن هي Object-based scripting language بس...
هي مش بتدعم الـ OOP بطريقة مباشرة، يعني يعني إيه؟ يعني هو لما بيقولك Class أنت عامله أو كدة هو عملياً ده مش مش Class ماهواش زي الـJava كدة ماهواش فعلاً OOP-based مش بيعملك كل حاجة من الصفر يعني مبيبقاش Class كبير وتقدر تعمل منه
 اللهم صل على النبي تقدر تعمل Static.
وتقدر تعمل interfaces وحاجات زي كدة لا، هو الدنيا هنا بسيطة بسيطة خالص يعني هو يدوبك class ـات كدة وبتـinherit منها وخلاص يعني مفيش أكتر من كدة. يعني هو يدوبك class بتعمل منه object وخلاص كأنك بتـ create
 Data type جديد وخلاص الموضوع مش كبير جداً زي الـ Java يعني، إحنا كان عندنا course كامل OOP خدنا كمية حاجات في الـ Java كبيرة جداً يعني، لأن وده يديك القوة بتاعة اللغة مثلاً قوة لغة Java هتلاقيها قوتها أوي في الموضوع بتاع الـ OOP ده علشان كدة أي Object أي...
sorry أي program هتعمله فيه شغل OOP كتير هتلاقي هتلاقي الناس بتروح للغة OOP-based زي زي الـ Java، مش هتلاقي واحد بيعمل حاجة زي كدة بالـ JavaScript يعني، لأن الـ JavaScript الـ OOP اللي فيها ضعيف أو هو حتى أصلاً ما يرتقيش لأن هو تقدر تسميه OOP يعني هو حاجة كدة بسيطة خالص.
يدوبك شوية class ـات وشوية إيه objects بتعملهم وبـ inherit منهم 
وصلى الله وبارك يعني مفيش حاجة أكتر من كدة. الـ Class inheritance، هو بدأ
 بالـ Class inheritance على طول هو مقلكش حتى إزاي تعمل Class، بس يعني هو هو هنا بيقولك إزاي تعمل Class يعني، أنت بتعمل بتكتب Class واسم الـ Class يعني هو نفس الموضوع في أي لغة تقريباً، الفرق بس إن الـ Constructor في الـ Java كنت بتسميه بنفس الاسم يعني كنت بتسميه Person.
هنا لا، هسميه constructor عادي وتديله كأنه function عادي على طول. لو هتعمل field هتكتب اسم الـ field على طول، هتكتب مثلاً x هيساوي أو هتكتب age هيساوي على طول. بس ولو هتعمل function بتكتب اسم الـ function على طول أو اللي هي الـ methods بيسموها يعني. هو هنا بيقولك إن الـ constructor بيتعمل إزاي يعني وبيقولك الـ class، أعتقد الشكل باين قدامكم يعني فخلاص الموضوع مش صعب يعني وعدت علينا في 500 لغة.
الموضوع بسيط يعني. بيقولك إن أنت لو أنت عايز تعمل field يعني بتعملها إيه بتقولها صراحة كدة يعني بتكتب اسم الـ field على طول وخلاص. ولو أنت عايز تـ inherit من حاجة بتكتب اسم الـ Class اللي هو الـ Employee مثلاً بيـ extend من الـ Person. لو أنت عايز تـ call أي حاجة من الـ Person ده يعني فـ أنت بتستعمل كلمة super زي الـ Java بالظبط يعني مفيش أي فرق في كـ syntax الفرق مش كبير.
بس.. بس الفرق في في هي شغالة إزاي أصلاً في الـ background ده.. ده طبعاً مش علينا في المحاضرة يعني، بس بس الفرق لو حد ممكن يسيرش هيلاقي إن فعلاً الـ JavaScript هي بس بتخدعك قدام عينك كدة، يعني هو بيقولك تمام أنت عايز Object أنا هعمل لك Object، بيجي من وراك كدة أصلاً ما يعملش Object بس هو إيه بيضحك عليك يعني بيبينلك إن ده Object.
اه.. نيجي نرجع للـ Class inheritance، هو هنا بيقولك طبعاً إيه لو أنت عايز تـ inherit تستعمل كلمة extends وهو هنا عندك كدة Class اسمه Employee بيـ extend من
 الـ Person وبينده الـ Constructor بتاع الـ Person اللي هو الـ super.
بيندهوا الـ Constructor بتاع الـ Person فين؟ أنا عايز أحط قلم طيب. الـ Constructor بتاع
 الـ Person كان بيشيل الـ Name والـ ID غير اللون بس. الـ Constructor بتاع الـ Person كان بيشيل Name و ID، هنا تحت كان بيشيل إيه؟ كان بيشيل في اللي هو الـ Constructor بتاع
 الـ Employee كان بيشيل ID و Name اللي هم نفس بتوع الـ Person وبيشيل حاجة كمان اسمها Role.
فهو بدل ما يقعد يعمل this.id هيساوي الـ id و this.name هيساوي الـ name، فهو
 بيقول لك إيه طب ما أنده الـ Constructor بتاع الـ Person ده على طول ما هو عندي جاهز، أندهه وأزود عليه إيه السطر بتاع الـ Role ده. هنا إحنا عاملين يعتبر function.. طب wait بس.
بس كنا وقفنا في الـ classes، لما بتيجي تعمل class فـ أنت هنا بالطريقة دي
 بتـ create الـ constructor بتاعك، الـ constructor بتاعك هو بالـ super
 خد الـ constructor من الـ Person اللي هو الـ class اللي عمل منه extend أو اللي عمل منه inherit يعني، وبس وحط السطر الجديد اللي هو عايزه.
في الـ Constructor بتاع الـ إيه بتاع الـ Class اللي أنت عملت عملت ليه extend يعني. وبالطريقة ديت برضه بتعمل الـ Methods بتاعتك إن أنت بتكتب بس على طول اسم 
الـ Function، مش محتاج إن أنت تعمل إيه تكتب Function أو تعمل Structure 
الـ Function كامل يعني. بيقولك برضه إن أنت بتستعمل كلمة super هنا.
ده كلام نظري يعني مالوش لازمة. هو هنا عامل الـ objects يعني بيقولك إزاي
 تـ create object كأنك بتعمل variable عادي بس بتيجي تعمل له new وتنده اسم 
الـ Constructor بتاعك في الـ... زي الـ Java بالظبط عادي يعني مفيش فرق كبير أو مفيش فرق أصلاً. وبعد كدة هييجي يـ print الـ person وهيـ print الـ employee اللي هو الـ emp قصدي.
اللي هو إيه الـ object اللي أنت عامله من الـ Person والـ object اللي أنت عامله من
 الـ Employee.. 
wait.. هتلاقيه طالع معاك إيه؟ طالع معاك الـ object ده والـ object ده، الـ object الأولاني اللي هو الـ ID اللي أنت مديهوله في الـ parameter بتاع الـ constructor 1،
 والـ name بتاعه، وده الـ ID بتاعه 2.
و John Doe 
John Doe  اللي هو إيه؟ دول الـ Name والـ ID، دول اللي أنت مديهم للـ Super ، الـ super ده اللي هو بتوع إيه؟ بتوع الـ Class اللي اسمه Person. والـ Manager ده اللي أنت كنت مديهوله في إيه؟ الـ Job بتاعته أو الـ Role بتاعه يعني في إيه.. مديه للـ Employee يعني، اللي هو في الـ Constructor بتاع class الـ Employee.
ده كدة حاول توقف الفيديو وتحله مع نفسك، هو هنا بيقولك إن يعني instanceof ديت قبل ما توقف يعني، اللي هو instanceof دي بتعمل إيه؟ ديت بيشوف إذا كان الـ Person أو بيشوف إذا كان الحاجة اللي أنت هتحطها في الأول هنا هل هي Object أو هل هي instanceof يعني من اسمها للإيه للـ Class ده.
فهل person هو instanceof من الكلاس اللي اسمه Person؟ آه، فدي كدة true. طيب هل الـ person هو instanceof الـ Employee؟ يعني هل الإنسان أو هل الـ person هو object من الـ Employee؟ لا فدي كدة false. طيب نيجي نشوف الـ employee هل هو person؟ هل الموظف هو person يعني؟ ف آه.
طيب نيجي نشوف الـ employee هل هو instanceof الـ Employee؟ هل الـ emp instanceof الـ Employee؟ آه، يعني إحنا كنا أصلاً مـ create ـين الـ object Employee من الـ Class اللي اسمه Employee. وديت إحنا كنا عاملين Employee بس بيـ inherit من الـ Person. هو Employee ده أصلاً من الـ الـ emp هو Object من الـ Employee، 
والـ Employee ده أصلاً بيـ inherit من الـ من الـ Person.
فعشان كدة دي برضه true. وديت false لأن الـ Person مش بيـ inherit أصلاً من
 الـ Employee. فهتلاقيها طلعت معاك true false true true. دي الـ Prototype inheritance. الـ Prototype inheritance ده أصلاً كان موجود قبل قبل الـ Classes وقبل الـ ECMAScript 6 يعني بكتير أصلاً. هو مش مش دارج استعماله النهاردة بصراحة أنا مشفتوش كتير مشفتوش تقريباً ولا مرة في code أصلاً.
أغلب الناس دلوقتي بقت تحول على موضوع الـ ECMAScript 6 اللي هو إن أنت بتستعمل object عادي و class ات عادي لأن هو أسهل بصراحة في الفهم يعني. إيه هو الـ.. بيقول إن أصلاً كل object في الـ JavaScript شايل حاجة اسمها prototype أو قوس قوس prototype قوس قوس..
دي.. ديت زي entity كدة جوه الـ يعني بتنزل مع كل object أنت بتعمله أصلاً بيقولك هي entity كل الـ JavaScript entities فيها هي object وكل object بيبقى جواه
 الـ prototype ده. الـ prototype ده بيبقى عامل زي الـ chain أو اللي هي السلسلة كدة اللي هي الحلقات اللي كلها متوصلة ببعض.
فـ كل prototype بيربط بـ prototype تاني، بيربط بـ prototype تاني.. الـ prototype تاني ده مثلاً ممكن يبقى prototype
 class عشان كدة معناها إنه بيـ inherit من الـ class ده. بيقعدوا يربطوا في بعض لحد ما آخـر آخر prototype كدة مبيبقاش مربوط بحاجة أو بيبقى مربوط بالـ null يعني عموماً يعني، بيبقى مش مربوط بحاجة.
واللي مش مربوط بحاجة ده معناته إنه هو إيه مش بيـ extend من حاجة يعني هو class لوحده. طبعاً ده كلام نظري قعد يعيد نفس الكلام اللي قلته يعني، بيقولك إن أنت إيه لو عايز تبص عليه يعني ممكن تعمل حاجة اسمها Object.prototype. ولو عايز تحط يعني تغير الـ prototype أو تجيب الـ prototype بتستعمل Object.get و Object.set prototype.
prototype وبتديها طبعاً إيه الـ element اللي أنت عايزه يعني أو اللي هو إيه الـ variable اللي أنت عايزه. لو أنت عايز تشوف الـ prototype مثلاً بتاع الـ person ده بتشوفه، تكتب مثلاً إيه Object.getPrototypeOf وبعد كدة إيه تديله في الـ parameters الـ person. هتلاقيها مكتوبة تحت كمان شوية يعني. هو هنا بيـ print الـ إيه الـ person هيـ print معاك الـobject ده.
وهيـ print معاك الـ Class ده. طيب هل لو أنت جيت قلت أنا عايز الـ Employee.name؟ مش الـ Employee ده.. هما دلوقتي مش inheritance مش واخدين inheritance من بعض، هل لو أنت جيت قلت له الـ Employee.name هيقرأ حاجة؟ هيقولك لأ undefined،
 أنا معنديش حاجة اسمها name. طيب لو أنت قلت له للـ person عايز الـ salary بتاعك، لو أنت قلت person.salary كدة.
هل هيقولك هل هيطلعلك أي value؟ لأ، ليه؟ لأن هو أصلاً مش عامل extend منه ولا بـ ولا عن طريق الـ prototype ولا عن طريق اللي هو الطريقة العادية اللي هي كلمة extend يعني. طيب عايزين نحل المشكلة ديت بس مش عايزين نستعمل الإيه ده؟ بس مش عايزين نستعمل الكلاسات يعني أو نستعمل الـ inheritance اللي في الـ بكلمة extend يعني، هنستعمله بالـ prototype.
نرجع للـ slides بس. فهو هنا لما ييجي يـ print الـ person.firstName.. الـ person أيوه عنده firstName هيطلعلك مش فاكر اسمه John تقريباً.. فين؟ هو كان مسميه John Smith
. فالـ firstName هيطلعلك John والـ lastName هيطلعلك Smith، الـ salary هيطلعلك undefined ديت كدة X undefined.
نيجي على الـ firstName، الـ firstName بتاع الـ Employee هتلاقيه برضه undefined. طيب الـ lastName برضه undefined؛ ليه؟ لأن هو مش عامل inherit أصلاً مفيش نسخة أو الـ Employee مش شايف الـ class اللي اسمه Person. طيب تيجي تقوله employee.salary هيطلع عادي ليه؟ لأن ده entity خاصة بالـ Employee.
فتلاقي طلعك جون سميث بعد كده Undefined وبعد كده Undefined كمان Undefined كمان Undefined كمان بعد كده السلاري اللي هو 2000 السلاري اللي 2000 ده طلعه من ال-Employee.Solary اللي هي أصلاً entity موجودة فيه من غير ما تنتمي لإنهارت طيب إحنا دلوقتي عايزين نخلي ال-Employee يشوف يبقى كأنه extend من ال-Person عايزين نخلي ال-Employee لما أقوله Employee.FirstName يشوف الإسم بتاعه يبقى شايف جون يبقى شايف سميث
ويبقى إيه ليه الـ Salary بتاعه بـ 2000. هنعمل دي إزاي؟ إن إحنا نغير إيه.. نغير.. نغير الـ Prototype بتاعك. إحنا قلنا إن أنت بتغير الـ Prototype بالـ إيه.. بالـ Get.. بالـ Get..
بالـ Get والـ Set، سواء Object.getPrototypeOf أو Object.setPrototypeOf بتشوفه وبتغيره يعني. فـ هو أنت بتديله في الأول.. أنا في الأول بصراحة مكنتش فاهم يعني الـcode ده لأن الطريقة دي مبقتش مستخدمة دلوقتي يعني، بس هي إيه المهم إن أنت تبقى عارفها عشان لو الدكتور جابها في trace ولا حاجة يعني.
الأول ده اللي هو إيه الحاجة اللي بيتعمل لها extend كأنك عملت emp.. Employee.. الخط سيئ عشان بالـ mouse يعني بس قشطة كأنك عملت Employee extend من الإيه من
 الـ Person.
هي دي هي هياها نفس الـ function ديت يعتبر. كأنك بتاخد الأولاني وبتحطه هنا وبتاخد التاني وتعمل extend إيه منه. فهو دلوقتي الـ Employee بقى شايف إنه هو إيه children من
 الـ Person. فـ لو أنت جيت ثانية أمسح العك عشان نبص على الـ slide.. لو أنت جيت تقوله
 الـ Person.firstName هيبقى شايف الـ John وهيبقى شايف Smith وبعد كدة تقوله Person.salary مش هيبقى شايف حاجة ليه؟ لأن الـ Person ماهواش children من
 الـ Employee.
الـ Employee هو اللي children من الـ Person. الـ Employee هو اللي واخد من
 الـ Person مش الـ Person هو اللي واخد من الـ Employee، فعشان كدة ديت هتفضل undefined زي ما هي. إنما دلوقتي لو أنت جيت قلت لي الـ Employee.firstName.. 
الـ Employee.firstName أنت دلوقتي already عملت inherit من الـ object اللي اسمه Person. خدت الـ data اللي جوه الـ Person فبقى هو شايف نفس الـ data بتاعت
 الـ Person وشايف زيادة عليها الـ data  بتاعته هو. يعني الـ data بتاعتي والـ data بتاعت
 الـ Person كمان. فلما تيجي تقوله ايه
Employee.firstName هيبقى شايف معاه John و Smith وهيبقى شايف هنا برضو زيادة عليها الـ Salary بتاعه اللي هو كان 2000 تقريباً. فهنا بقى شايف John Smith 
و undefined، undefined ديت طالعة لأن الـ Person مش هو يعني Person ديت كدة extends..
من الـ Employee.. دي كدة غلط، لو أنت عملت دي كدة هتطلعلك هنا value. إنما هو مش عامل كدة، هو عامل الـ Employee هو اللي بيـ extend من الـ Person عشان كدة دي طالعة.. هتطلع معاك بـ undefined، وهيديك الـ.. هيديك الـ Name والـ Last Name. هتبان أكتر لما نيجي نطبق في العملي، طبعاً ده مقارنة نظرية يعني.
ممكن تبقى تبص عليها، هنفتح دلوقتي الـ Visual Studio ثانية.. هنفتح دلوقتي الـ Visual Studio ونشوف الـ.. هنحاول نطبق عملي يعني نعمل class ـات كدة وحاجة.. ثانية.. تعال نـ create
 project جديد كدة.
هنبدأ في أول حاجة مثلاً كنا عايزين إيه، نجرب شوية الـ variables كدة، نعمل مثلاً let x
لو جينا نقوله مثلاً إيه.. log(x) ده، أو تعالوا مثلاً إيه عشان مقعدش بس كل شوية أsave..   
log تعالوا نـprint الـ x ده نشوف جواه إيه.. طبعاً لو النقطة البيضا ديت بس عشان متتلخبطش لأن المفروض إن أنا أsave، لو النقطة البيضا دي ظاهرة فـ ده ناتج الـ file save القديم.
دلوقتي كدة أنا مـ save، فـ تعالوا نـ run كدة.. هتـ run تشوف من الـ terminal ده اللي هيطلعلك يعني، أنت ممكن تـrun على web مثلاً أو على حاجة بس أنا هـrun هنا على
 الـ terminal أسهل يعني. هتلاقي طلعلك undefined ليه undefined؟ لأن إحنا ممعملناش إيه.. معملناش value. لو قلنا هيساوي 5 كدة.. شوف لو أنا عملت run دلوقتي هيطلع undefined برضو ليه؟ لأن أنا ما saveـيتش الـ file، المفروض إن أنت تـ save الأول
هيطلع معاك 5 عادي. طيب لو قلتله مثلاً log بعد الـ log ده، قلتله مثلاً x هيساوي string ننتأكد برضه إنه هو إيه dynamic data type، هيساوي test وبعد كدة قلت له إيه log طبعاً مش لازم semicolon بس أنا متعود أكتبها يعني مثلا test 
5 ديت اللي طالعة من ده.
من سطر 2، و test ديت طالعة من بعد ما إحنا عملنا إيه.. عملنا assign للـ variable x بـ test. طيب تعالوا مثلاً إن إحنا إيه نشوف إيه.. نعمل variable كمان، let y مثلاً هيساوي إيه.. هيساوي 5.
ورحنا مثلاً قلناله إيه.. log لـ x == y، وقلناله x === y.
 هيطلع المفروض الأولانية ديت true واللي تحتها false. 
 هيطلع true و false. 
true ديت لأن هو بيقارن
 الـ value اللي جوه نفسها ملوش دعوة بالرقم نفسه أو ملوش دعوة بالـ data type.
وده هو هنا بيقارن data type معاك كمان. فأنت لو قلت له حتى أصلاً إيه.. عشان نتأكد برضه.. log type of، 
typeof الـ y.
هتلاقي true، true دي طالعة من دا هي، وبعد كدة دي number لأن ده number وده string وده false لأن هو إيه؟ ده بيقارن برضو بـ type of، كأنك بتعمل two conditions، 
بتـ check على الـ value وبتتـ check برضه إن الـ type of ديت هتساوي الـ type of دي.
ال هو ال x والـ y. طيب تعالوا كدا إننا نـ create مثلاً class، نعمل مثلاً class Person، بنعمل class وبنعمل جواها الـ constructor، الـ constructor بتكتبها صريحة كدا زي ما قلنا، وبعد كدة بتديله الـ parameters اللي إنت عايزها، إحنا مثلاً هنعمل ال Person أو أي شخص عادي بيبقى ليه الـ ID بتاعه وبيبقى ليه ال name، اسمه والـ ID بتاعه.
طيب ماشي الـ constructor بتاعك، هنقوله إيه؟ هنقوله this.id، نفس اللي كنا بنعمله في
 الـ Java عادي جداً يعني. this.id هيساوي الـ id، ونقوله this.name هيساوي الـ name بتاعك. اللي هو الـ name اللي داخلك في الـ constructor بتاعك والـ id اللي داخلك في 
الـ constructor بتاعك. طيب تعالوا نعمل مثلاً field كمان هنسميه إيه؟
test أي حاجة، أي field عادي، هتلاقي إنه هو إيه؟ بيقبل كدة. يبقى فاهم إن هو عنده test، أ
و عنده field، هنديله مثلاً initial value بـ 10، أو هنديله مثلاً إيه؟ هنخليه age، 
هنخلي الـ age ديت attribute مش، مش حاجة بتتحط جوه إيه؟ أو field، مش حاجة بتتحط جوه الـ constructor يعني. الـ age بتاعه هخليه مثلاً 21 ولا حاجة.
تعالوا نعمل function كمان أو method، هنعمل مثلاً method،
 saying مثلاً، say ديت بتقوله إيه؟ هي method void عادي، إنت مابتكتبش أي حاجة، إنت بتكتب الـ method على طول وخلاص، يعني بتكتب اللي إنت عايزه.
هنقوله log، مابتكتبش يعني structure function كاملة، مابتعدش تعمل تكتب function وتقعد تكتب الـ structure بتاع الـ function كامل، يعني مابتعدش تكتب function
 والـ parameter والـ body والـ return type أو كدة. مع إن هي JavaScript أصلاً مفيهاش، مابتعدش تكتب void والكلام ده، إنت بتكتب function واسم الـ function على طول وخلاص. تعالوا نكتب ايه..
طبعاً لو إنت دوست على حرف الذال في الـ keyboard، اللي هو في الزاوية تحت ESC، اللي هو أنا كاتبه دلوقتي عشان يبان بس، ثانية أكبر كدة، هو ده، لو إنت دوست عليه ديت بيخليك تقدر تكتب الـ variables جوه الـ...
جوه الجملة اللي إنت بتعملها print أصلاً. تعالوا مثلاً كدة نكتب إيه؟ تكتبها إزاي الـ variable؟ كدة بتعمل dollar sign، بعد كدة العلامة ديت يعني، dollar sign بعد كدة curly brackets، هنقوله مثلاً this.name يعني الـ object اللي هيجيلك الـ name بتاعه هيساوي أو saying مثلاً...
say
say
My ID equal 
بعد كدة الـ this.id مثلاً.
الـ age بتاعي، this.age، الـ this.age ديت هتفضل ثابتة بـ 21 لأن هو مابيعملهاش 
overwrite أصلاً أو مابيغيرهاش من الـ constructor، إنما الـ ID والـ name دول هيتغيروا لما نيجي نعمل، لما نيجي نعمل إيه؟ لما نيجي نعمل objects. طيب تعالوا كدة نـ create object مثلاً نقوله let...
person 1 مثلاً، person 1 ده كدة الـ object بتاعي هيساوي new وبنده الـ constructor،
 الـ constructor بيتننده إزاي؟ خليني أتأكد من الـ recording.. اه شغال. new Person أو اسم الـ class بتاعك يعني، وبتدي الـ data اللي إنت عايزها، الـ ID مثلاً بتاعه بـ 1، والـ name بتاعه إيه...
عبد الله مثلاً. هنعمل كمان object، هنعمل تلاتة objects مثلاً، ده كدة person واحد وperson اتنين وperson تلاتة، الـ ID بـ 1 و2 و3، مثلاً ده أحمد وده كدة ايه ؟. تعالوا نـ log أو نـ print يعني الـ...
هو يعني كـ design patterns تقريباً، أو clean code قصدي sorry، المفروض إن الـ class بيتسمى باسم capital يعني، بس أنا معملتش كدة يعني فمش مشكلة يعني. تعالوا نـ run كدة ونشوف الـ output، هنلاقي عندك الـ object الأولاني اللي هو الـ age بـ 21، الـ age ثابت،
 والـ ID...
والـ name بتاعك إيه؟ الـ ID متغير والـ name بتاعك متغير على حسب اللي إنت إيه؟ الحاجات اللي إنت كاتبها يعني هنا. انما الـ age كانت ثابت لإن إنت عامله هنا إيه؟  يعني field ثابت ما تغيرش. طيب تعالوا إن إحنا مثلاً إيه؟ نـ run الـ function نقول له مثلاً إيه؟
 person1. نقول له مثلاً إيه؟
شغل الـ function اللي اسمها say. تمام؟ تعالوا كدة نشوف كدة person 1.say،
 هنشوف الـ output اللي هيطلع.. طيب فين؟ أنا مـ save ـيتش تقريباً. أه.. طلع عبد الله say اللي هو الـ name بتاعك اللي إنت مباصيه اللي هو بتاع 1 ده، والـ My ID كذا والـ age بتاعي كذا say.
طيب لو إنت جيت تغير وخليتها مثلاً إيه؟ person 2، هتلاقي الـ data بتاعتك اتغيرت عادي، لأن إنت عاملها بـ this، إنما الـ age هيفضل ثابت زي ما هو
 أحمد، و2، و21. 21 دي ثابتة لأن هو إيه؟ field زي ما قلنا ، تعالوا نعمل إيه تاني؟ تعالوا مثلاً إحنا نـ log.. إيه؟ نقدر إن إحنا نـ access الـ field بتاعتك، نقوله مثلاً هاتلي الـ age بتاعك...
وده بـ print بتاعه الـ ID، وده نـ print بتاعه الـ name، كأنه object عادي بالظبط، يعني مفيش أي فرق. هتلاقي.. أنا مـ save ايتش، كدة saveـيت، 
21 اللي هو الـ age ثابت، ID بتاع التاني.
والتالت الـ name بتاعه. طيب تعالوا نعمل إيه؟ نعمل class كمان بيـ extend منه يعني، class employee مثلاً.
الـ class ده هيبقى فيه إيه؟ constructor، والـ constructor بتاعه بياخد 
تلت حاجات: ID وname وjob، والـ.. هياخد الحاجات.. هياخد الحاجات اللي بيقولها يعني في الأول، هياخدها اللي هي الـ name والـ ID، هياخذهم من الـ Person لأن هو بيـ extend من
 الـ Person.
يبقى هقوله إيه؟ this.id ووبعد كدة هيقوله this.job
الـ job اللي هو إيه؟ اللي دخلك على طول. تعالوا دي نسينا نعملها extends، extends..
 هيـ extend من إيه؟ من الـ Person. تعالوا نـ run كدة.. هو أصلاً إحنا معملناش.. معملناش objects لسه أو حاجة. تعالوا نعمل مثلاً إيه؟ let emp 1.
employee، والـ employee ده هيبقى إيه؟ هنديله الـ data بتاعته، هنديله مثلاً ID بـ 1 مثلاً للـ employee الأولاني، الـ name مثلاً بفارس، الـ job مثلاً إيه؟ programmer.
نـ run، log emp 1، هنشوف الـ emp 1 ده الـ data اللي جواه.. تعالوا نـ save ونشوف كدة.. في error طالع منين؟.. أه تمام، أنا عامل دي this لأن هي دي الـ...
الحاجات اللي داخلة لك أصلاً في الـ constructor يعني، أنا عملت this عشان متعود على ديت يعني. تعالوا نشوف كدة.. أنا مـ save يتش، تعالوا نـ save ونـ run الـ file. هتلاقي الـ employee بتاعك فيه الـ age بتاعه بـ 21، طيب منين طلعت age؟ أنا مش عامل هنا age أصلاً، يعني الـ employee بتاعي مش عامل age، طب ما إنت عامل super، يعني إنت عامل inherit منه.
Inherit من الـ Person فبقى هو شايف الـ age بتاعه، بقى عنده الـ age بقى عنده نفس نفس كل حاجة موجودة في الـ class اللي اسمه Person فبقى عنده الـ age وبقى عنده الـ ID، الـ ID اللي إنت مديهوله اللي هو بـ 1 وعنده فارس اللي هو الـ name بتاعه وعنده الـ job بتاعته. طيب لو إنت مديتوش مثلاً إيه؟ أو نخلي دي بعدين يعني.
كدة إنت عندك emp 1، طيب عايزين نتأكد إن هو برضو شايف الـ function الـ.. الـ methods بتاعت الـ.. بتاعت الـ Person يعني، كان عنده.. كان عنده بتاعه اسمها function اسمها same.. اسمها say، تعالوا نـ runـها كدة.. أنا مـ save يتش.
فارس say، الـ ID بتاعه كذا والـ age بتاعه كذا. طيب تعالوا نشوف نغير موضوع الـ.. نغير حاجات الـ prototype.
لما بنيجي نغير الـ prototype بيتغير بـ.. wait.. لما بنيجي نغير الـ prototype بيتغير بالـ.. بيتغير باسم الـ object بتاعك يعني، تعالوا نشيل بس الـ logs ديت ونشيل ديت.
ونسيب الـ employee 
تعالوا كدة نشوف الـ.. object.prototype، 
object.Prototype، نديله الـ emp 1 ونشوف الـ..
الـ prototype اللي هيطلعلك، هتلاقيه طالع Person. Person دي طالعة منين؟ لأن هو
 بيـ extend من ده. الـ Employee بيـ extend من الـ Person. طيب تعالوا نشيل الـ extend كده. نقفل دي بس كده. نشيل الـ extend. تعالوا نـ run، هتلاقيه ضرب error. ليه ضرب error؟ بسبب الـ super. أنا مـ save يتش، تعالوا أ save بس الأول
بسبب الـ super، ليه الـ super؟ لأن هو أصلاً معندوش حاجة اسمها super، أو هو مش شايف حاجة بيـ inherit منها. تعالوا نشيل دي. دلوقتي إنت عندك class للـ ID بتاعه وليه الـ Job، تعالوا نشيل الـ Job.. طبعا إنت عندك class للـ Job وخلاص، تمام؟ فلما نيجي برضه
 نعرفه..
هو دلوقتي بقى شايف عنده الـ Employee، وشايف بس الـ Employee ده ليه الـ Job بتاعته، والـ Person ده class تاني لوحده. يبقى هم ملهمش أي علاقة ببعض، ولا عامل منه extend. تعالوا نـ save بس.
نـ run كدة.. تعالوا نشوف الـ run، هتلاقي إيه؟ الـ prototype بتاعه ولا حاجة، أو حاجة فاضية يعني.
طيب، تعالوا مثلاً إننا إيه نغير الـ prototype بتاعه. إحنا دلوقتي الـ prototype بتاعك حاجة فاضية..
طيب تعالوا نقول Object.setPrototypeOf وبتاخد two parameters، two parameters إيه؟ الحاجة اللي في الأول اللي هي الـ Employee 1 والـ... الـ object اللي في الأول يعني، إنت بتتعامل في الـ setPrototypeOf دي بتتعامل معاها بـ object.
مش بالـ class، كأنك إنت كنت دلوقتي بتعمل Employee بـ extend من الـ class اللي اسمه Person، نفس الموضوع هتعمله هنا بس إنت بتعمله بـ objects، الـ object ده هيـ extend من الـ object اللي اسمه Person1 مثلاً أو Person3.
طيب ماشي، تعالوا نشوف الـ log كده.. الـ Emp1. تعالوا كدة نعمله إيه.. نـ save ونـ print، بقى شايف إيه؟ بقى شايف الـ Job
 programmer بس، مابقاش شايف أي.. مش شايف أي حاجة غير الـ.. غير الـ object نفسه يعني. طيب تعالوا نشوف الـ data اللي جواه كدة..
هتلاقي الـ Job، اللي هو إيه؟ ده. طيب لو جيت أقوله هات لي الايه؟ الـ Emp1.name... بقى قاري إيه؟ بقى قاري عمر. ليه قاري عمر؟ قاري عمر لأن إنت قولتله إن ده...
الـ prototype بتاعه مربوط بالـ prototype بتاع Person3، 
Person3 أو مربوط بيشاور على الـ Person3، فإنت الـ data اللي عند Person3 إنت هنا شايفها في الـ Employee، فإنت كأنك عملت object اسمه Emp1، الـ Emp1 ده بيـ contain إيه؟ بيـ contain name والـ name ده بيساوي عمر، وكأنه برضو بيـ contain إيه؟
وكأنه بيـ contain برضو الـ age، وبيـ contain.. بيـ contain كل حاجة موجودة في
 الـ Person، وعنده function اسمها say كمان، وعنده.. عنده كل حاجة موجودة في 
الايه؟ الـ Person. تعالوا كدة نغير الـ name ديت نخليها مثلاً إيه؟ age. هل أصلاً الـ class اللي اسمه Employee ده شايف حاجة اسمها age؟ لا. طيب تعالوا نـ run كدة.. المفروض لو هو مش شايفها هيطلع undefined.
بقى قاري 21، قاري الـ age بتاع ده مع إن هو أصلاً مش موجود.
 طيب تعالوا نتأكد إن هو طلّع.. إن هو أصلاً إيه لو إحنا شيلنا الـ prototype ده،
 المفروض إن هو هيطلعلك إيه؟ هيطلعلك undefined لأن هو مش شايف ده، فمطلع undefined ليه؟ لأن إحنا شيلنا الـ setPrototypeOf فهو دلوقتي مش شايف ده، كأنك مش عامل extend، إنما هنا إنت كأنك عامل extend بالظبط بس عامل extend عن طريق الايه؟ 
الـ prototype.
بالمناسبة لو إنت جيت تـ print الـ Emp1 ده من غير وإنت عامل extend بالـ prototype، يعني كأنك عامل inheritance بالـ prototype.. ثانية.. هتلاقيه طلعلك إيه؟ هتلاقيه طلعلك
 الـ Job بس، مطلعلكش الـ class كله على بعضه أو مطلعلكش الـ object كله على بعضو. ثانية كدة أوريهالك.. هتلاقيه مطلعلك Person أصلاً، مطلعلك Person حاجة. يعني ده object من الـ Person أو كأنه object من الـ Person أو بيـ extend من الـ Person.
وعنده برضو الـ data دي إضافية زيادة عليه يعني. طيب لو إنت كنت عامل extend، تعالوا كدة أورهالك، extend من الـ Person. لو إنت كنت عاملها بـ extend من الـ Person من غير ما نغير الـ prototypes ديت، تعالوا نشيل الكلام ده.
تزود برضه الـ constructor بتاعك الـ ID والـ name، نرجعه بس إيه كأنه بيـ extend عشان أوريك الفرق حتى في الـ print لما تيجي تـ print الـ object اللي أنت عامله inherit يعني إيه بكلمة extend.
هنديله مثلاً ID بواحد، و name بـ . تعالوا كدة نشوف الـ super، والـ super ده نديله الـ ID بتاعه والـ name. تعالوا كدة نـ run..
هـ save ونـ run، طلعلك إيه؟ طلعلك Employee، يعني ده object من الـ class اللي اسمه Employee مش.. مش من الـ Person. لما إنت كنت عامله بالـ prototype كان مطلعلك Person ومطلعلك بس الـ data الزيادة اللي عليه، إنما هنا مطلعلك كل حاجة جواه، يعني مطلعلك كأنه object كامل على بعضه فيه كل الـ data بتاعته.
وفيه برضو حتى الـ functions بتاعته، فيه الـ age، يعني هو شايف كل حاجة جواه، كأنك عامله إيه بالظبط؟ نفس الـ inheritance بتاع الـ Java يعتبر، بس زي ما قولتلك هو أصلاً من جوه مش شغال زي الـ Java، يعني مش شغال.. يعني من جوه ماهواش شغال بـ.. ماهواش OOP based فعلاً، يعني ماهواش OOP حقيقي، لا هو بس حاجة كدة إيه..
شكليًا من قدامك بس كدة بيبقى بيظهرلك إنه OOP، بس من الـ background يعني بتاعه مش شغال كدة. هتلاقيه مطلعلك ايه؟ فارس say واللي هي الـ function اللي اسمها say. بس كدة يعتبر خلصنا، الفيديو طويل حبتين بس.. بس يعني بإذن الله تكون فهمت.