🔥 ۴۰ درصد تخفیف ثبت‌نام دوره‌ها قبل از افزایش قیمت‌ها
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ دلیله آریان‌پور
object.assign
فرهاد پایور حل شده توسط فرهاد پایور

سلام

وقت بخیر

چطور با تغییر شعاع برای ابجکت جدید مساحت رو با شعاع یک یعنی همون ابجکت اصلی حساب میکنه و تو تابع getterتغییر رو اعمال نمیکنه؟

let circle = {
        radiuse: 1,
        get area() {
          return Math.PI * this.radiuse ** 2;
        },
      };
      let newObj = {};
      Object.assign(newObj, circle);
      circle.radiuse = 10;
      newObj.radiuse = 20;
      console.log(circle.area);
      console.log(newObj.area);

سلام! مشکل اصلی در کد شما این است که شما `Object.assign` برای ایجاد یک نسخه جدید از `circle` استفاده کرده‌اید، اما این روش یک shallow copy ایجاد می‌کند. به این معنا که اگر ویژگی‌های `circle` شیء اصلی مربوط به یک شیء دیگر (مانند `radiuse`) باشند، آنها به اشتراک گذاشته می‌شوند.

برای حل این مشکل، بهتر است از یک روش عمیق‌تر برای ایجاد کپی از شیء استفاده کنید. می‌توانید از متد `JSON.parse()` و `JSON.stringify()` برای ایجاد یک deep copy استفاده کنید. در ادامه کد به صورت تغییر یافته نشان داده شده است:

let circle = {
 radiuse: 1,
 get area() {
   return Math.PI * this.radiuse ** 2;
 },
};
// ایجاد یک deep copy از circle
let newObj = JSON.parse(JSON.stringify(circle));
circle.radiuse = 10;
newObj.radiuse = 20;
console.log(circle.area);  // Output: 314.1592653589793
console.log(newObj.area); // Output: 1256.6370614359173

لطفاً توجه داشته باشید که این روش ممکن است برخی از موارد خاص را پشتیبانی نکند و در مواقعی که نیاز به deep copy دقیق دارید، ممکن است نیاز به راه‌حل‌های پیچیده‌تری داشته باشید.

بهترین پاسخ
فرهاد پایور ۲۵ آذر ۱۴۰۲، ۱۷:۴۳

سلام! مشکل اصلی در کد شما این است که شما `Object.assign` برای ایجاد یک نسخه جدید از `circle` استفاده کرده‌اید، اما این روش یک shallow copy ایجاد می‌کند. به این معنا که اگر ویژگی‌های `circle` شیء اصلی مربوط به یک شیء دیگر (مانند `radiuse`) باشند، آنها به اشتراک گذاشته می‌شوند.

برای حل این مشکل، بهتر است از یک روش عمیق‌تر برای ایجاد کپی از شیء استفاده کنید. می‌توانید از متد `JSON.parse()` و `JSON.stringify()` برای ایجاد یک deep copy استفاده کنید. در ادامه کد به صورت تغییر یافته نشان داده شده است:

let circle = {
 radiuse: 1,
 get area() {
   return Math.PI * this.radiuse ** 2;
 },
};
// ایجاد یک deep copy از circle
let newObj = JSON.parse(JSON.stringify(circle));
circle.radiuse = 10;
newObj.radiuse = 20;
console.log(circle.area);  // Output: 314.1592653589793
console.log(newObj.area); // Output: 1256.6370614359173

لطفاً توجه داشته باشید که این روش ممکن است برخی از موارد خاص را پشتیبانی نکند و در مواقعی که نیاز به deep copy دقیق دارید، ممکن است نیاز به راه‌حل‌های پیچیده‌تری داشته باشید.

فرهاد پایور ۲۵ آذر ۱۴۰۲، ۱۷:۴۳