Objects vs Closures

โพสนี้เป็นโพสที่ผมดองมายาวเหยียดดด (เพิ่งสังเกตว่าตั้งกะกันยาปีที่แล้ว) เนื่องจากควรจะต้องเข้าใจเรื่อง Call/Apply, Binding และ Closure ก่อน ถึงจะมาโพสนี้ได้ครับ

เรื่องมันมีอยุว่า ใน JavaScript ถ้าเราจะสร้าง Object ที่เก็บ State ได้ เรามักจะใช้อยู่ 2 เทคนิคครับ นั่นคือใช้ Object เลยไม่งั้นก็ใช้ Closure ซึ่งแต่ละอันก็มีข้อดีข้อเสียแตกต่างกันไป ออริจินัลโพสจาก Skilldrick ครับ

อ้อ ตัวอย่างทั้งหมดนี้ ดูแบบ Live Example ได้ที่นี่นะครับ

สร้าง Object Builder / Constructor

ลองมาดูแบบใช้ Object กันก่อน ซึ่งมันก็คือการสร้าง Constructor นั่นเองครับ

มาดูแบบใช้ Closure กันบ้าง

คราวนี้ก็สร้าง Instance จาก Constructor (หรือ Object Builder) สองตัวนี้

แล้วมันแตกต่างกันยังไงละหว่า

เรื่องของเรื่องคือ ถ้าใช้ Object แล้ว State จะถูกใช้ผ่าน this เวลาที่เราเรียก Method เช่น a1.sayHi() this ก็จะเป็นตัว Object นั้น

แต่ถ้าเป็น Closure State จะถูกเก็บไว้ใน Lexical Scope ซึ่งมันต่างกันของ Object กันอีตอนที่เราจะไปจัดการกับไอ State เนี่ยแหละครับ

This highlights the first key difference between objects and closures: access to the internal state.

เรามีวิธีการเปลี่ยนค่าใน State ของ Object ได้ 3 วิธี เช่นต่อไปนี้

แต่เราจะใช้ทั้งสามวิธีนี้กับ Closure ไม่ได้ครับ

การที่เราจะทำได้ ต้องสร้าง Method นั้นไว้ใน Closure นั้นด้วย แบบนี้

แล้วข้อดีข้อเสียของแต่ละแบบล่ะ ?

ข้อดีของแบบ Object

จากที่เห็นว่าเราสามารถเปลี่ยนแปลงค่าใน State ของ Object ได้ 3 วิธีข้างบน จะสังเกตว่า เราสามารถสร้าง Method เหล่านี้จากที่ไหนก็ได้ แล้วค่อยมายัดใส่เอา แตกต่างจาก Closure ที่ต้องสร้าง Method เหล่านี้จากใน Object Builder ที่เอาไว้สร้าง Closure ของมันเท่านั้น

ข้อดีอีกข้อคือในแง่ของ Memory ถ้าเป็น Closure การที่เราเอา Method ไปไว้ใน Object Builder ทำให้เวลาเราสร้าง Instance ใหม่ แต่ละตัวก็จะมี Method ของใครของมัน ไม่เหมือนกับของ Object ที่เราสร้าง Method เหล่านี้ครั้งเดียว ทำงานผ่าน this แล้วก็ใส่ให้กับ Instance ไหนก็ได้ ไม่งั้นก็แชร์ผ่าน prototype เลยก็ยังได้อีก

ข้อดีของแบบ Closure

การที่บอกว่าแบบ Object สามารถใส่ Method จากที่ไหนก็ได้ ถ้ามองอีกมุมนึงก็คือเราเสียความเป็นส่วนตัว (Privacy) ของเราไป ใครก็สามารถสร้าง Method แล้วก็มายัดใส่เมื่อไหร่ก็ได้ ซึ่งในขณะที่ Closure ถ้าจะแก้ก็ต้องมาแก้ใน Object Builder ของ Closure เท่านั้น

อีกอย่างคือเราไม่ต้องกังวลกับ this ซึ่งต้องห่วงเรื่อง Binding ด้วย

งี้ควรจะเลือกแบบไหนดี ?

So, when should you use objects and when closures? If you’re making hundreds of object-type things then they should probably be objects. If there are only a few and you have security concerns then closures are a better bet.

ตามนั้นแหละครับ ผมว่ามันขึ้นอยุกับสถานการณ์ ถ้าสมมติผมจะเขียนอะไรให้คนอื่นใช้ก็คงต้องเป็น Closure แต่ถ้าเป็นทั่วไปก็ใช้ Object ได้ไม่มีปัญหาครับ

One thought on “Objects vs Closures

  1. I prefer closure wa. But prototype sharing is near-impossible using closures so if you need some kind of inheritance, I guess the only (or easier) way is to use prototypes.

    btw. just changed versez model.js to use prototype just because of that. huhu.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>