āĻāĻāύāĻ āĻā§āĻŦā§āĻā§āύ, .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! đ