کلمات کلیدی getter و setter کلمات کلیدی هستند که پشت یک تابع میان و میقرار میگیرند و به ما اجازه میدهند از اسم اون تابع مثل یک متغیر بیایم و استفاده بکنیم و وقتی میخایم بیایم و اون متغیر رو اصطلاحا get یا set بکنیم اون توابع هستند که میان و صدا زده میشوند و مثل یک پراپرتی میایم و باهاش رفتار میکنیم حال اگر یک ابجکتی فقط بیاد و مقدار Getter داشته باشه و setter نداشته باشه اون پراپرتی میاد و به صورت read only میشود و ما اجازه ی قرار دادن اطلاعاتی در داخل اون رو نداریم و اگر setter داشته باشد به صئرت write only می شود و اگر هردوتا رو داشته باشد میتوانیم هر دو تا رو انجام بدهیم
let newObj {
name : ' ddd ',
family : 'gfgdfgf',
get age(){
return this.userAge },
set age(uAge){
if(uAge<10){
throw new Error('dsdfsfdsfdsfdsf')
}
this.userAge = uAge;
}
}
console.log(newObj)
newObj.age = 5;
console.log(newObj.age)
حالا مزیتهای استفاده از getter و setter بخایم بگیم اولی سینتکس راحتتری دارد دومی سینتکس یکسانی برای تابع و پروپرتی دارد و سومی هم دادههای یک شی را امنتر میکند
ما برای ایجاد یک شی دو تا مدل داشتیم یکی به صورت معمولی یا literal notation دومی هم به صورت اشیاء سازنده یا کانستراکتور فانکشن constructor function همچنین ما در این حالت برای تعریف و قرار دادن پراپرتیها باید از this استفاده بکنیم
نکته : ما وقتی یک شی معمولی داشتیم موقعی که میخاستیم از اون استفاده کنیم فقط کافی بود که بیایم و اون رو صدا بزنیم ولی هنگام استفاده از توابع سازنده ابتدا باید یک نمونه از اون تابع بسازیم و بعد ازش بتونیم استفاده بکنیم
حال برای این که بیایم و getter و setter در داخل توابع سازنده امون تعریف کنیم صرفا کافی است به شیوه زیر تعریف کنیم
function secondObj(){
this.name = "mohamad";
this.family = "sadeghi";
Object.defineProperties(this,{
age: {
get: function(){ return this.userAge; },
set: function(uAge){ ig(uAge < 10) { throw new Error('Access defind'); }
this.userAge = uAge;
console.log('in setter')
}
}
})
}
تفاوت constructor object و literal object
1 - استفاده از this که در توابع سازنده ما برای تعریف متغیر هامون باید از اون استفاده بکنیم ولی در لیترالها نیازی به اون نداریم
2- تعریف توابع getter و setter در هر دو
3 - آبجتهای از نوع کانستراکتور میان و میتونن مقادیر ورودی بگیرند و برا اساس ورودی که میگیرند اون آبجکت متفاوت باشند ولی نوع literal چون عملا new نمیشوند پس عملا ورودی رو هم نمیتونن بیان و بگیرند و برا اساس ورودی که میگیرند بیاین و مقدار اون رو تغیر بدهند
4- در حالت literal نمیتوانید چند نسخه از شی رو داشته باشید و به یاد داشته باشد همواره از همان نسخه اصلی استفاده خواهید کرد و اگر بیایم و یک کپی ازش بگیریم و در اون نسخه کپی بیایم و تغیر بدیم تغیر ما در نسخه ی اصلی هم ایجاد میشود ( مقادیر رفرنس آنها یکی هستش )
// literal notation
var original = { 'property' : 'orignal' }
console.log(original.property); // original
var clone = original;
clone.property = 'clone'
console.log(original.property); // clone
5- مفاهیم public و private در اشیاء اگر بیایم و در یک تابع سازنده یک متغیر رو تعریف کنیم مثلا با let اون متغیر به صورت private تعریف شده است و برای دسترسی به اون در داخل تابع نیازی به this نداریم و در خارج تابع هم نمیتونیم به اون دسترسی داشته باشیم و صرفا درون اون تابع ب اون دسترسی داریم همچنین در اشیا literal ما هر چی متغیر تعریف بکنیم به صورت public هستش و از بیرون میتونیم بیایم و بهش دسترسی پیدا بکنیم
نکته : هنگام کپی کردن آبجکتها یا متغیرها در اصل میاد و یک خونه از اون رفرنس رو برامون کپی میکند حال اگر ما بخایم بیایم و یک کپی یا کلون رو انجام بدیم که این کلون به صورت مستقل رفتار کنه و کپی نباشه باید به چند شیوه زیر بیایم و عمل بکنیم
روش اول
let user = { name : "John" , age : 30 }
let clone = {}
for (let key in user){
clone[key] = user[key] }
روش دوم استفاده از تابع assign : که برای کپی کردن و مرج کردن چند ابجکت میاد و مورد استفاده قرار میگیرد
Object.assign(dest,[src1,src2,src3,..])
در هنگام مرج کردن اوویت با سمت راستی هست و اگر پراپرتیهای یکسانی داشته باشند اولویت با مقدار سمت راستی هستش و اون رو اعمال میکند
استفاده از garbage collection : در هر زبانی ما تعداد زیادی متغیر و داده رو تعریف میکنیم حال اگر این دادههای زبانهای برنامه نویسی مون هیچ کاری با این دادههای ما نداشته باشند به مرور زمان این دادهها هی بزرگ بزرگتر میشه و حافظه زیادی رو از ما مصرف میکند و ممکن باعث خطا یا کرش در برنامه امون بشه و همه زبانها یک ابزاری دارند به نام garbage collection که متغیر هایی که استفاده نمیشوند بیاد و اون متغیر هارو حذف کند