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! 😊