user
JavaScript က Object Oriented Language ဟုတ်လား


assistant
JavaScript က OOP language မဟုတ်ပါဘူး။ ဒါပေမယ့် အတိုင်းအတာတခုထိ OOP feature တွေ support နိုင်ဖို့တော့ ကြိုးစားပြင်ယူလာခဲ့တယ်။ 
programming language တွေမှာ data type တွေကို စုစည်းဖို့နဲ့ အမျိုးအစား ခွဲနိုင်ဖို့အတွက် construct အမျိုးမျိုး ပြင်ဆင်ထားကြတယ်။ ဥပမာ Swift မှာ struct နဲ့ class နှစ်မျိုးရှိတယ်။ Java မှာ class ပဲရှိပြီး Go မှာတော့ struct ပဲရှိပါတယ်။ JavaScript မှာ ဘာမှမရှိပါဘူး။
ဒီ keyword တွေရဲ့ ရည်ရွယ်ချက်တွေထဲက တခုက clsss definition လို့ခေါ်တဲ့ object specification ဖြစ်တယ်။ object တခုမှာ ဘယ်လို state တွေ ပါရမယ်။ ဘယ်လို behavior ရှိရမယ် စသဖြင့် format တခု သတ်မှတ်လိုက်ပြီး code တွေကို ကျစ်ကျစ်လျစ်လျစ် ရေးချင်တာဖြစ်တယ်။
ဥပမာ Http Object ဆိုရင် headers တွေပါရမယ်။ သူ့ထဲက payload ကိုဖတ်နိုင်တဲ့ method တွေပါရမယ် စသဖြင့်။
JavaScript မှာ class မရှိပေမယ့် အနီးစပ်ဆုံးဆိုရင် Prototype ကိုပြလို့ရတယ်။ Prototype ဆိုတာက JavaScript object တွေထဲပါတဲ့ နောက်ထပ် object တခုပါပဲ။ ဘာမှမရှိတဲ့ object ကို toLocaleString, toString စသဖြင့် log ကြည့်ပါ။ ဒီ method တွေက ဘယ်ကလာသလဲဆိုရင် prototype ဆိုတဲ့ property ရဲ့တန်ဖိုးဖြစ်တဲ့ inner object ထဲက လာပါတယ်။
ဒီ prototype က javascript function တွေထဲမှာပါတဲ့ Function.prototype နောက် Array.prototype စတာတွေရဲ့ ဘိုးအေကြီး ဖြစ်တဲ့ Object.prototype ဖြစ်တယ်။ ဆိုလိုချင်တာက မိသားစု သစ်ပင်အရ Function.prototype ဆိုတဲ့ object ထဲမှာလည်း Object.prototype object တခုရှိပါမယ်။ ဒါပေမယ့် Object.prototype object ထဲမှာတော့ prototype ထပ်မရှိဘူးပေါ့။
ဒီတော့ object အနေနဲ့ property တခု အတောင်းခံရတဲ့အခါ အပြင် object ကနေ အတွင်း prototype ထိ ပတ်ရှာပါတယ်။ ဒါကြောင့် object အလွတ်ကြီးထဲမှာ toLocaleString ရှိနေတာဖြစ်တယ်။
ကျွန်တော်တို့ prototype ကိုသုံးပြီး OOP langauge တွေမှာလို class definition တွေရေးနိုင်ပါတယ်။ ကိုယ်လိုချင်တဲ့ method တွေပါအောင် ရေးထားတဲ့ prototype ကိုသုံးပြီး Object.create(myPrototype) လို့ ဆောက်လိုက်ရင် myPrototype ထဲက method တွေကို property အဖြစ် ကူးယူဆောက်ပေးပါလိမ့်မယ်။ ဒါ JavaScript မှာ OOP နဲ့အနီးစပ်ဆုံးတူတဲ့အရသာပါပဲ။ 
ဒါပေမယ့် OOP native language တွေမှာလို state property တွေကိုတော့ ထည့်မရေးထားနိုင်ပါဘူး။ ဒီအချက်က undefined property access တွေကိုဖြစ်စေနိုင်တုန်းပါပဲ။ ဒါကြောင့် constructor method တွေကို helper အဖြစ် ရေးထားတဲ့ pattern ကိုကျင့်သုံးလာကြပါတယ်။ ဒီပုံစံမှာတော့ လိုအပ်တဲ့ state ကို function ရဲ့ parameter ကနေ လက်ခံတယ်။ function ထဲမှာ လိုအပ်တဲ့ prototype ကနေ object ဆောက်တယ်။ object မှာ state property တွေကို ချက်ချင်း set လုပ်တယ်။
နောက်ပိုင်းမှာတော့ constructor function ကိုမိတ်ဆက်လာခဲ့တယ်။ ဒီပုံစံမှာတော့ function ကို new keyword နဲ့ ခေါ်မယ်။ ကိုယ်လိုချင်တဲ့ prototype ကို function နဲ့ သေချာနွှယ်ထားမယ်ဆိုရင် JS Engine အနေနဲ့ prototype မှန်အောင် ရွေးဆောက်ပေးပြီး ဆောက်လိုက်တဲ့ object ကို this ဆိုတဲ့ keyword မှာပြန်ချည်ပေးမယ်။ this ကိုသုံးပြီး လိုအပ်တဲ့ state တွေ set ပေါ့။
ဒီပုံစံမှာလည်း language တိုးတက်ပြောင်းလဲမှုတွေကို လွတ်လွတ်လပ်လပ် မလုပ်နိုင်သေးတဲ့အတွက် သီးခြား class keyword ကိုမိတ်ဆက်လာခဲ့တယ်။ အရင်က constructor function ကို class ထဲမှာ constructor လို့ခေါ်ပြီး constructor method က object တွေထဲ ထည့်မကူးပေးလိုက်မယ့် method တခုဖြစ်တယ်။
ဒါပေမယ့် JavaScript မှာ OOP native တွေလိုမျိုး state ကို class definition (object specification) ထဲထည့်မသတ်မှတ်နိုင်သေးပါဘူး။
ကံကောင်းတာက Java နဲ့ သူတင်ကိုယ်တင် ယှဥ်နိုင်တဲ့ C# လို OOP language ရဲ့ ပဲ့ကိုင်ရှင် Microsoft ဆီက လက်ဆောင်တခု ရခဲ့ကြပါတယ်။ typescript တဲ့။ အချိန်ရရင် လေ့လာထားသင့်ပါတယ်ခင်ဗျာ။

CodeHub by Harry Yan, Sep 2023