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