javascript-visualized

🎉👨‍👩‍👧‍👧 JavaScript Visualized: Prototypal Inheritance

āĻ•āĻ–āĻ¨āĻ“ āĻ­ā§‡āĻŦā§‡āĻ›ā§‡āĻ¨, .length, .split(), .join() āĻāĻ°āĻ•āĻŽ āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻŽā§‡āĻĨāĻĄ āĻ—ā§āĻ˛ā§‹ āĻ†āĻŽāĻ°āĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸ā§āĻŸā§āĻ°āĻŋ, āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻŦāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ‰āĻĒāĻ° āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ? āĻ†āĻŽāĻ°āĻž āĻ•āĻ–āĻ¨āĻ“ āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡ āĻāĻ—ā§āĻ˛ā§‹ āĻ¸ā§āĻĒā§‡āĻ¸āĻŋāĻĢāĻžāĻ‡āĻĄ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ‡āĻ¨āĻŋ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ—ā§āĻ˛ā§‹ āĻ†āĻ¸āĻ˛ā§‹ āĻ•ā§‹āĻĨāĻž āĻĨā§‡āĻ•ā§‡? āĻāĻ–āĻ¨ āĻ†āĻŦāĻžāĻ° āĻŦāĻ˛āĻŋā§Ÿā§‡āĻ¨ āĻ¨āĻž, “āĻāĻŸāĻž āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ, āĻāĻŸāĻž āĻœāĻžāĻĻā§, 🧚đŸģ‍♂ī¸ āĻ•ā§‡āĻ‰ āĻœāĻžāĻ¨ā§‡ āĻ¨āĻž, āĻšāĻžāĻšāĻžāĻšāĻž “, āĻāĻŸāĻž āĻ†āĻ¸āĻ˛ā§‡ āĻ¯ā§‡ āĻ•āĻžāĻ°āĻŖā§‡ āĻ†āĻŽāĻ°āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¸ā§‡āĻŸāĻžāĻ•ā§‡ āĻŦāĻ˛ā§‡ prototypal inheritance . āĻāĻŸāĻž āĻ…āĻ¸ā§āĻĨāĻŋāĻ° āĻāĻ•āĻŸāĻž āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡ āĻāĻŸāĻž āĻ•āĻŋ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨, āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻœā§‡āĻ“ āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ¨āĻž!

āĻ…āĻ¨ā§‡āĻ• āĻ¸āĻŽā§ŸāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻ‡ āĻ°āĻ•āĻŽā§‡āĻ° āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻ¤ā§ˆāĻ°ā§€ āĻ•āĻ°āĻ¤ā§‡ āĻšā§ŸāĨ¤ āĻŽāĻ¨ā§‡ āĻ•āĻ°ā§‡āĻ¨, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻž āĻ“ā§Ÿā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ āĻ†āĻ›ā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŽāĻžāĻ¨ā§āĻˇ āĻ…āĻ¨ā§‡āĻ• āĻ•ā§āĻ•ā§āĻ° āĻ¨āĻŋā§Ÿā§‡ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻŦāĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡!

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻž āĻ•ā§āĻ•ā§āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĻāĻ°āĻ•āĻžāĻ° āĻ¯ā§‡āĻŸāĻž āĻ¸ā§‡āĻ‡ āĻ•ā§āĻ•ā§āĻ°āĻŸāĻžāĻ•ā§‡ āĻ°āĻŋāĻĒā§āĻ°ā§‡āĻœā§‡āĻ¨ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡! 🐕 āĻĒā§āĻ°āĻ¤āĻŋāĻŦāĻžāĻ° āĻāĻ•āĻŸāĻž āĻ¨āĻ¤ā§āĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ˛āĻŋāĻ–āĻžāĻ° āĻŦāĻĻāĻ˛ā§‡ āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻž āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ(āĻ†āĻŽāĻŋ āĻœāĻžāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ­āĻžāĻŦāĻ›ā§‡āĻ¨, ES6 āĻ•ā§āĻ˛āĻžāĻ¸ āĻ¨āĻŋā§Ÿā§‡ āĻ†āĻŽāĻŋ āĻĒāĻ°ā§‡ āĻ†āĻ˛āĻžāĻĒ āĻ•āĻ°āĻŦ!) āĻ¯ā§‡āĻŸāĻž āĻĻāĻŋā§Ÿā§‡ āĻ†āĻŽāĻ°āĻž Dog instance āĻ¤ā§ˆāĻ°ā§€ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ new keyword āĻĻāĻŋā§Ÿā§‡(āĻāĻ‡ āĻĒā§‹āĻ¸ā§āĻŸ āĻ†āĻ¸āĻ˛ā§‡ āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¨āĻŋā§Ÿā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻāĻŸāĻž āĻ¨āĻŋā§Ÿā§‡ āĻ¤ā§‡āĻŽāĻ¨ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦ āĻ¨āĻž)āĨ¤

āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§‡āĻ• āĻ•ā§āĻ•ā§āĻ°ā§‡āĻ°āĻ‡ āĻāĻ•āĻŸāĻž āĻ¨āĻžāĻŽ, āĻāĻ•āĻŸāĻž āĻœāĻžāĻ¤, āĻāĻ•āĻŸāĻž āĻ°āĻ™ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ†āĻ›ā§‡ āĻ¯ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĻāĻŋā§Ÿā§‡ āĻ¸ā§‡ āĻ˜ā§‡āĻ‰ āĻ˜ā§‡āĻ‰(bark) āĻ•āĻ°āĻŦā§‡!

āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž Dog āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻž āĻ•ā§āĻ°āĻŋā§Ÿā§‡āĻŸ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻāĻŸāĻžāĻ‡ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ›āĻŋāĻ˛ āĻ¨āĻž! āĻ…āĻŸā§‹āĻŽā§‡āĻŸāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻ°ā§‡āĻ•āĻŸāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻ¯ā§‡āĻŸāĻžāĻ•ā§‡ āĻŦāĻ˛ā§‡ prototype ! āĻŦāĻžāĻ‡ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ, āĻāĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻžāĻ° āĻāĻ•āĻŸāĻž constructor āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ†āĻ›ā§‡, āĻ¯ā§‡āĻŸāĻž āĻ…āĻ°āĻŋāĻœāĻŋāĻ¨āĻžāĻ˛ āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻžāĻ° āĻāĻ•āĻŸāĻž āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻŽāĻžāĻ¤ā§āĻ°, āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ Dog āĻāĻ° āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸āĨ¤

Dog āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° prototype āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻŸāĻž non-enumerable, āĻŽāĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¯āĻ–āĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ access āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡, āĻ¤āĻ–āĻ¨ āĻāĻŸāĻž āĻĻā§‡āĻ–āĻž āĻ¯āĻžā§Ÿ āĻ¨āĻžāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻž āĻ āĻŋāĻ•āĻ‡ āĻ†āĻ›ā§‡!

āĻ†āĻšā§āĻ›āĻž, āĻ¤āĻžāĻšāĻ˛ā§‡.. āĻāĻ‡ property āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‡āĻ¨ āĻ†āĻ›ā§‡? āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻšāĻ˛ā§‡āĻ¨ āĻ•āĻŋāĻ›ā§ āĻ•ā§āĻ•ā§āĻ° āĻŦāĻžāĻ¨āĻžāĻ‡ āĻ¯ā§‡āĻ—ā§āĻ˛ā§‹ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻžāĻ¤ā§‡ āĻšāĻžāĻšā§āĻ›āĻŋāĨ¤ āĻŦā§‹āĻāĻžāĻ¨ā§‹āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ°ā§āĻĨā§‡, āĻ†āĻŽāĻŋ āĻ“āĻĻā§‡āĻ° āĻ¨āĻžāĻŽ āĻĻāĻŋāĻ˛āĻžāĻŽ  dog1 āĻāĻŦāĻ‚ dog2. dog1 āĻšāĻšā§āĻ›ā§‡ Daisy, āĻāĻ•āĻŸāĻž āĻ•āĻŋāĻ‰āĻŸ āĻ•āĻžāĻ˛ā§‹ Labrador! dog2 āĻšāĻšā§āĻ›ā§‡ Jack, āĻ¨āĻŋāĻ°ā§āĻ­āĻŋāĻ• āĻ¸āĻžāĻĻāĻž Jack Russell 😎

āĻšāĻ˛ā§‡āĻ¨ dog1 āĻ•ā§‡ āĻ•āĻ¨āĻ¸ā§‹āĻ˛ā§‡ āĻ˛āĻ— āĻ•āĻ°āĻŋ, āĻāĻŦāĻ‚ āĻāĻ° āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛ā§‹ āĻĻā§‡āĻ–āĻŋāĨ¤

āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻĄ āĻ•āĻ°āĻž āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛ā§‹ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›āĻŋ, āĻ¯ā§‡āĻŽāĻ¨  name, breed, color, āĻāĻŦāĻ‚ bark..āĻ•āĻŋāĻ¨ā§āĻ¤ā§, āĻ†āĻ°ā§‡āĻš! āĻāĻ•āĻŋ! āĻāĻ‡ __proto__ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻŸāĻž āĻ•āĻŋ? āĻāĻŸāĻž non-enumerable, āĻŽāĻžāĻ¨ā§‡ āĻāĻŸāĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻĻā§‡āĻ–āĻž āĻ¯āĻžā§Ÿ āĻ¨āĻž āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻ¯āĻžāĻ‡āĨ¤ āĻšāĻ˛ā§‡āĻ¨ āĻāĻŸāĻž āĻāĻ•ā§āĻ¸āĻĒā§āĻ¯āĻžāĻ¨ā§āĻĄ āĻ•āĻ°āĻŋ! 😃

āĻ†āĻ°ā§‡āĻš! āĻāĻŸāĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻāĻ•āĻĻāĻŽ Dog.prototype āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻŽāĻ¤ā§‹! āĻ•āĻŋ āĻŽāĻ¨ā§‡ āĻšāĻšā§āĻ›ā§‡? āĻ†āĻ¸āĻ˛ā§‡, __proto__ āĻšāĻšā§āĻ›ā§‡ Dog.prototype āĻāĻ°āĻ‡ āĻāĻ•āĻŸāĻž āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸āĨ¤ āĻāĻŸāĻžāĻ‡ āĻ†āĻ¸āĻ˛ā§‡  prototypal inheritance : āĻ•ā§‹āĻ¨ āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ°āĻ‡ āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ°ā§‡āĻ° āĻĒā§āĻ°ā§‹āĻŸā§‹āĻŸāĻžāĻ‡āĻĒā§‡āĻ° access āĻ†āĻ›ā§‡āĨ¤ đŸ¤¯

āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻšāĻšā§āĻ›ā§‡, āĻāĻ‡ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻŸāĻž āĻāĻ¤ āĻĒāĻŋāĻ¨āĻŋāĻ•ā§‡āĻ° āĻ•ā§‡āĻ¨? āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻĻāĻ°āĻ•āĻžāĻ° āĻšā§Ÿ, āĻ¯ā§‡āĻŸāĻž āĻ¸āĻŦ āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻ‡ āĻļā§‡ā§ŸāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻŦāĻ˛āĻž āĻ¯āĻžā§Ÿ, bark āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻ•āĻĨāĻžāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻāĻ‡ āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻž āĻāĻ•āĻ‡āĨ¤ āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¯āĻ¤āĻŦāĻžāĻ° āĻ†āĻŽāĻ°āĻž āĻ¨āĻ¤ā§āĻ¨ āĻ•ā§āĻ•ā§āĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ›āĻŋ āĻ¤āĻ¤āĻŦāĻžāĻ°āĻ‡ āĻ¨āĻ¤ā§āĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ•āĻŋ? āĻļā§āĻ§ā§ āĻļā§āĻ§ā§ āĻŽā§‡āĻŽā§‹āĻ°āĻŋ āĻ–āĻžāĻšā§āĻ›ā§‡! āĻŦāĻ°āĻ‚, āĻāĻŸāĻž āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻžāĻ•ā§‡ Dog.prototype āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ­ā§‡āĻ¤āĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻĄ/āĻĸā§āĻ•āĻŋā§Ÿā§‡ āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ! đŸĨŗ

Whenever we try to access a property on the instance, the engine first searches locally to see if the property is defined on the object itself. However, if it can’t find the property we’re trying to access, the engine walks down the prototype chain through the __proto__ property! āĻ¯āĻ–āĻ¨āĻ‡ āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻ¨ āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻ•ā§‹āĻ¨ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ access āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡, āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻĒā§āĻ°āĻĨāĻŽā§‡ locally āĻ¸āĻžāĻ°ā§āĻš āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–ā§‡ āĻ¯ā§‡ āĻ¸ā§‡āĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ­ā§‡āĻ¤āĻ° āĻ¸ā§‡āĻŸāĻž āĻĄāĻŋāĻĢāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻžāĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¸ā§‡ āĻ¯āĻĻāĻŋ āĻ¸ā§‡āĻ‡ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ¨āĻž āĻĒāĻžā§Ÿ, āĻ¤āĻ–āĻ¨ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻŸāĻžāĻ‡āĻĒ āĻšā§‡āĻ‡āĻ¨ā§‡āĻ° āĻ¨āĻŋāĻšā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻĨāĻžāĻ•ā§‡(walks down the prototype chain) __proto__ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡!

āĻāĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻŸāĻž āĻļā§āĻ§ā§ āĻāĻ•āĻŸāĻž āĻ¸ā§āĻŸā§‡āĻĒā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšā§Ÿā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻžāĻ° āĻ…āĻ¨ā§‡āĻ• āĻ¸ā§āĻŸā§‡āĻĒ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡! āĻŽāĻ¨āĻ¯ā§‹āĻ— āĻĻāĻŋā§Ÿā§‡ āĻ–ā§‡ā§ŸāĻžāĻ˛ āĻ•āĻ°āĻ˛ā§‡ āĻĻā§‡āĻ–āĻŦā§‡āĻ¨, āĻ†āĻŽāĻŋ āĻ¯āĻ–āĻ¨ __proto__ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻž āĻāĻ•ā§āĻ¸āĻĒā§āĻ¯āĻžāĻ¨ā§āĻĄ āĻ•āĻ°ā§‡ Dog.prototype āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĻā§‡āĻ–āĻ˛āĻžāĻŽ, āĻ¤āĻ–āĻ¨ āĻ†āĻ¸āĻ˛ā§‡ āĻāĻ•āĻŸāĻž āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ‡āĻ¨āĻ•ā§āĻ˛ā§āĻĄ āĻ•āĻ°āĻŋāĻ¨āĻŋāĨ¤ Dog.prototype āĻ¨āĻŋāĻœā§‡āĻ‡ āĻāĻ•āĻŸāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻāĻŸāĻž āĻ†āĻ¸āĻ˛ā§‡ Object āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ°ā§‡āĻ° āĻāĻ•āĻŸāĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸! āĻāĻ° āĻŽāĻžāĻ¨ā§‡ Dog.prototype āĻ¨āĻŋāĻœā§‡āĻ“ āĻ†āĻ°ā§‡āĻ•āĻŸāĻž __proto__ āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡! āĻāĻŦāĻ‚ āĻ¸ā§‡āĻŸāĻž āĻ†āĻ¸āĻ˛ā§‡ Object.prototype āĻāĻ° āĻāĻ•āĻŸāĻž āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸!

āĻļā§‡āĻˇāĻŽā§‡āĻˇ, āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‰āĻ¤ā§āĻ¤āĻ° āĻĒā§‡ā§Ÿā§‡ āĻ—ā§‡āĻ›āĻŋ! āĻĒā§āĻ°āĻļā§āĻ¨ āĻ•āĻŋ āĻ›āĻŋāĻ˛ āĻ¸ā§‡āĻŸāĻžāĻ‡ āĻ•āĻŋ āĻ­ā§āĻ˛ā§‡ āĻ—ā§‡āĻ˛ā§‡āĻ¨ āĻ¨āĻžāĻ•āĻŋ? āĻĒā§āĻ°āĻļā§āĻ¨ āĻ›āĻŋāĻ˛ āĻāĻ¤ā§‹ āĻāĻ¤ā§‹ āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻŽā§‡āĻĨāĻĄ āĻ•ā§‹āĻĨāĻž āĻĨā§‡āĻ•ā§‡ āĻ†āĻ¸ā§‡? āĻ¤āĻžāĻ°āĻž āĻ¸āĻ•āĻ˛ā§‡āĻ‡ āĻ†āĻ¸āĻ˛ā§‡ āĻ†āĻ›ā§‡ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻŸāĻžāĻ‡āĻĒ āĻšā§‡āĻ‡āĻ¨ā§‡āĻ° āĻ­ā§‡āĻ¤āĻ°ā§‡! 😃

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ .toString() āĻŽā§‡āĻĨāĻĄāĻŸāĻž āĻ¨ā§‡ā§ŸāĻž āĻ¯āĻžāĻ•āĨ¤ āĻāĻ‡ āĻŽā§‡āĻĨāĻĄ āĻ•āĻŋ locally dog1 āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĄāĻŋāĻĢāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡? āĻšā§āĻŽāĻŽ āĻ¨āĻžāĻš!â€Ļ āĻāĻŸāĻž āĻ•āĻŋ āĻ¤āĻžāĻšāĻ˛ā§‡ dog1.__proto__ āĻ¯ā§‡āĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻ•ā§‡ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ•āĻ°ā§‡(Dog.prototype) āĻ¸ā§‡āĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ†āĻ›ā§‡? āĻāĻŦāĻžāĻ°āĻ“ āĻ‰āĻ¤ā§āĻ¤āĻ° āĻšāĻšā§āĻ›ā§‡, āĻ¨āĻžāĻš! āĻāĻŸāĻž āĻ•āĻŋ āĻ¤āĻžāĻšāĻ˛ā§‡ Dog.prototype.__proto__ āĻāĻ° āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ°(Object.prototype) āĻŽāĻ§ā§āĻ¯ā§‡ āĻ†āĻ›ā§‡? āĻšā§āĻ¯āĻžāĻ! 🙌đŸŧ

Now, we’ve just been using constructor functions (function Dog() { ... }), which is still valid JavaScript. However, ES6 actually introduced an easier syntax for constructor functions and working with prototypes: classes!

Classes are only syntactical sugar for constructor functions. Everything still works the same way!

We write classes with the class keyword. A class has a constructor function, which is basically the constructor function we wrote in the ES5 syntax! The properties that we want to add to the prototype, are defined on the classes body itself.

Another great thing about classes, is that we can easily extend other classes.

Say that we want to show several dogs of the same breed, namely Chihuahuas! A chihuahua is (somehowâ€Ļ 😐) still a dog. To keep this example simple, I’ll only pass the name property to the Dog class for now instead of name, breed and color. But these chihuahuas can also do something special, they have a small bark. Instead of saying Woof!, a chihuahua can also say Small woof! 🐕

In an extended class, we can access the parent class’ constructor using the super keyword. The arguments the parent class’ constructor expects, we have to pass to super: name in this case.

myPet has access to both the Chihuahua.prototype and Dog.prototype (and automatically Object.prototype, since Dog.prototype is an object).

Since Chihuahua.prototype has the smallBark function, and Dog.prototype has the bark function, we can access both smallBark and bark on myPet!

Now as you can imagine, the prototype chain doesn’t go on forever. Eventually there’s an object which prototype is equal to null: the Object.prototype object in this case! If we try to access a property that’s nowhere to be found locally or on the prototype chain, undefined gets returned.


Although I explained everything with constructor functions and classes here, another way to add prototypes to objects is with the Object.create method. With this method, we create a new object, and can specify exactly what the prototype of that object should be! đŸ’ĒđŸŧ

We do this, by passing an existing object as argument to the Object.create method. That object is the prototype of the object we create!

Let’s log the me object we just created.

We didn’t add any properties to the me object, it simply only contains the non-enumerable __proto__ property! The __proto__ property holds a reference to the object we defined as the prototype: the person object, which has a name and an age property. Since the person object is an object, the value of the __proto__ property on the person object is Object.prototype (but to make it a bit easier to read, I didn’t expand that property in the gif!)


Hopefully, you now understand why prototypal inheritance is such an important feature in the wonderful world of JavaScript! If you have questions, feel free to reach out to me! 😊