برنامه نویسی

بیت های سریع جاوا اسکریپت: روش های محاسبه شده

احتمالاً در مورد کلیدهای محاسبه شده در اشیا می دانید، اما آیا متوجه شده اید که می توانید از کلیدهای محاسبه شده با روش کوتاه نویسی استفاده کنید؟ احتمالاً هرگز نمی خواهید این کار را انجام دهید، اما شما می توانید.

const methodName = 'myMethod';
const computedKey = 'computed';

const myObj = {
  // Computed Property
  [computedKey]: 'It worked!',

  // 🤔 Is this a good idea? Probably not, no.
  // Computed property + Method shorthand
  [methodName]() {
    return this.computed;
  },
};

myObj.myMethod();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درس تاریخ

در نسخه های اولیه جاوا اسکریپت، توابع همه در محدوده جهانی تعریف شده بودند. حتی در آن زمان می‌توانستید از براکت‌ها برای دریافت یا تنظیم مقادیر محاسبه‌شده استفاده کنید، اما بیشتر قابلیت‌هایی که ما فکر می‌کنیم در دسترس نبودند.

ECMAScript 3

ECMAScript 3 عبارات تابع و متدهای شی را برای ما آورده است. شما می توانید از نماد براکت برای تنظیم ویژگی ها یا روش ها استفاده کنید.

// Old JavaScript.
var computedKey = 'computed';

var myObj = {
  // Key and function separately.
  myMethod: function () {
    return this.computed;
  },
};

myObj[computedKey] = 'It worked!';

myObj.myMethod();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در صورت تمایل می‌توان نام متدهای پویا را داشت، اما آنها باید پس از ایجاد شی تعریف می‌شدند.

myObj = {};
myObj[methodName] = function() {
  return this.computed;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ECMAScript 2015

ECMAScript 2015 هم مختصر روش شی و هم خصوصیات محاسبه شده را معرفی کرد.

// Exciting new JavaScript!
const computedKey = 'computed';

const myObj = {
  // Method shorthand
  myMethod() {
    return this.computed;
  },
  // Computed Property
  [computedKey]: 'It worked!',
};

myObj.myMethod();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگرچه مقاله MDN به طور خاص به آن اشاره نمی کند، می توانید همان طور که در ابتدای مقاله نشان داده شده است، خلاصه روش را با نام ویژگی های محاسبه شده ترکیب کنید.

مشکلات

ممکن است موارد لبه ای وجود داشته باشد که انجام این کار منطقی باشد، اما به طور کلی باید از این تکنیک اجتناب کنیم. هنگام تلاش برای درک کد، مکان یابی روش ها را بسیار دشوار می کند و کارایی پشتیبانی ویرایشگر کد مانند IntelliSense و اطلاعات نوع را کاهش می دهد.

جایگزین ها

هش ها یا پراکسی ها می توانند جایگزین های خوبی برای نام روش های محاسبه شده باشند. به برخی از راه‌هایی که می‌توانیم این کار را انجام دهیم نگاهی بیندازید و به من بگویید که کدام یک برای شما بهتر کار می‌کنند!

کد مشترک

const methodName = 'myMethod';
const computedKey = 'computed';

const myObj = {
  getComputed() {
    return this.computed;
  },
  [computedKey]: 'It worked!',
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نقشه برداری ساده

یک نقشه ساده از رشته‌ها برای تطبیق نام روش‌ها به تنظیمات بسیار کمی نیاز دارد، اما فراخوانی متدها را کمی سخت‌تر می‌کند.

const methodMap = {
  [methodName]: 'getComputed',
};

myObj[methodMap.myMethod]();
// 'It worked!';
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نقشه برداری محدود

استفاده از یک شی با متدهای متصل به شی اصلی نیاز به تنظیمات بیشتری دارد اما کد را برای مصرف کننده ساده می کند.

const methodMapBound = {
  [methodName]: myObj.getComputed.bind(myObj),
};

methodMapBound.myMethod();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پروکسی پایه

یک شی پراکسی بیشتر پیچیدگی ها را از بین می برد، زیرا می توانید مستقیماً با پروکسی تعامل داشته باشید. این از یک بررسی استاتیک در گیرنده برای یافتن ویژگی محاسبه شده ما استفاده می کند.

const basicProxy = new Proxy(myObj, {
  get(target, prop, receiver) {
    if (prop === methodName) {
      return myObj.getComputed;
    }
    return Reflect.get(...arguments);
  },
});

basicProxy.myMethod();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نقشه پروکسی پلاس

با استفاده از نقشه نام ویژگی a در مثال Plain Mapping، می‌توانیم از هر تعداد نگاشت متد پشتیبانی کنیم. اگر بخواهیم کمی ریسک حلقه های بی نهایت را بپذیریم، در واقع می توانیم از چندین غیر مستقیم پشتیبانی کنیم!

const methodMap = {
  [methodName]: 'getComputed',
  'thisIsWild': methodName,
};

const methodProxy = new Proxy(myObj, {
  get(target, prop, receiver) {
    if (methodMap[prop]) {
      // Using receiver allows multiple indirection
      return receiver[methodMap[prop]];
    }
    return Reflect.get(...arguments);
  },
});

methodProxy.myMethod();
// 'It worked!'

methodProxy.thisIsWild();
// 'It worked!'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری

امیدوارم از این سرگردانی کوتاه در مورد برخی از قابلیت های غیرمنتظره و (امیدوارم) استفاده نشده جاوا اسکریپت لذت برده باشید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا