Prototype Pattern trong Javascript
In a flexible language like Javascript, you can apply a lot of different patterns. Depending on the circumstances we can apply. Object oriented programing or OOP, you’ve heard and used them a lot already. But in Javascript, we have another programing direction, called prototype. Now let’s try to see what prototypes are interesting and the benefits of using prototypes.
Prototype
This pattern is focused on helping create objects from a previous blueprint, and the following objects will inherit different methods and properties. This property is called prototype inheritance. When creating an object in ES6, you are familiar with class declarations. In ES5, we have another way is the function constructor. Suppose when writing a game we want to build a Warrior class as follows:
1 2 3 4 5 6 7 8 | <span class="token keyword">function</span> <span class="token function">Warrior</span> <span class="token punctuation">(</span> name <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> name <span class="token operator">=</span> name <span class="token punctuation">}</span> <span class="token keyword">const</span> harryPotter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Warrior</span> <span class="token punctuation">(</span> <span class="token string">'Harry Potter'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> ngan <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Warrior</span> <span class="token punctuation">(</span> <span class="token string">'Ngan'</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> snake <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Warrior</span> <span class="token punctuation">(</span> <span class="token string">'Snake'</span> <span class="token punctuation">)</span> |
With the above method, 3 warriors were created. They share a common contructor, Warrior
1 2 3 4 5 | harryPotter <span class="token punctuation">.</span> constructor <span class="token operator">===</span> ngan <span class="token punctuation">.</span> constructor <span class="token comment">// true</span> snake <span class="token punctuation">.</span> constructor <span class="token operator">===</span> ngan <span class="token punctuation">.</span> constructor <span class="token comment">// true</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> harryPotter <span class="token punctuation">.</span> constructor <span class="token punctuation">.</span> name <span class="token punctuation">)</span> <span class="token comment">// Warrior</span> |
Let’s say, now our warrior class wants to have different skills like bash, slash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">function</span> <span class="token function">Warrior</span> <span class="token punctuation">(</span> name <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> name <span class="token operator">=</span> name <span class="token keyword">this</span> <span class="token punctuation">.</span> hp <span class="token operator">=</span> <span class="token number">100</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function-variable function">bash</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">-=</span> <span class="token number">10</span> <span class="token punctuation">}</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function-variable function">slash</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">/=</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> harryPotter <span class="token punctuation">.</span> <span class="token function">bash</span> <span class="token punctuation">(</span> ngan <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> ngan <span class="token punctuation">.</span> hp <span class="token punctuation">)</span> <span class="token comment">// 90</span> ngan <span class="token punctuation">.</span> <span class="token function">slash</span> <span class="token punctuation">(</span> snake <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> snake <span class="token punctuation">.</span> hp <span class="token punctuation">)</span> <span class="token comment">// 50</span> |
Now how the warriors have their skills and spoiled each other. But here, each warrior has a unique skill, but obviously, this skill is identical. This is a waste when we check back
1 2 3 | harryPotter <span class="token punctuation">.</span> bash <span class="token operator">===</span> ngan <span class="token punctuation">.</span> bash <span class="token comment">// false</span> snake <span class="token punctuation">.</span> bash <span class="token operator">===</span> ngan <span class="token punctuation">.</span> bash <span class="token comment">// false</span> |
That’s why we need something like a constructor, which is the prototype
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">function</span> <span class="token function">Warrior</span> <span class="token punctuation">(</span> name <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> name <span class="token operator">=</span> name <span class="token keyword">this</span> <span class="token punctuation">.</span> hp <span class="token operator">=</span> <span class="token number">100</span> <span class="token punctuation">}</span> Warrior <span class="token punctuation">.</span> prototype <span class="token punctuation">.</span> <span class="token function-variable function">bash</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">-=</span> <span class="token number">10</span> <span class="token punctuation">}</span> Warrior <span class="token punctuation">.</span> prototype <span class="token punctuation">.</span> <span class="token function-variable function">slash</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">/=</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token operator">...</span> harryPotter <span class="token punctuation">.</span> bash <span class="token operator">===</span> ngan <span class="token punctuation">.</span> bash <span class="token comment">// true</span> snake <span class="token punctuation">.</span> bash <span class="token operator">===</span> ngan <span class="token punctuation">.</span> bash <span class="token comment">// true</span> |
The above method is similar to the following writing method
1 2 3 4 5 6 7 8 9 10 | Warrior <span class="token punctuation">.</span> prototype <span class="token operator">=</span> <span class="token punctuation">{</span> bash <span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">-=</span> <span class="token number">10</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> slash <span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> target <span class="token punctuation">)</span> <span class="token punctuation">{</span> target <span class="token punctuation">.</span> hp <span class="token operator">/=</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
Conclusion
However, this method will lose the Warrrior constructor. This is how the prototype has implemented its inheritance and sharing capabilities in javascript. Hopefully the next article I can continue to explore more interesting things. Thank you for following up
References
https://medium.com/better-programming/the-prototype-pattern-in-javascript-bfe9ff433e6c