خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه اشیاء پروکسی در جاوا اسکریپت کار می کنند؟

اشیاء پراکسی راه دیگری را برای نادیده گرفتن رفتار شی تعریف شده در اختیار شما قرار می دهند.

یک شیء پراکسی جاوا اسکریپت به شما امکان می دهد رفتار شی دیگری را رهگیری و سفارشی کنید، بدون اینکه اصل را تغییر دهید.

با استفاده از اشیاء پروکسی، می‌توانید داده‌ها را اعتبارسنجی کنید، عملکردهای اضافی را ارائه دهید و دسترسی به ویژگی‌ها و توابع را کنترل کنید.

همه چیز را در مورد استفاده از اشیاء پروکسی و نحوه ایجاد آنها در جاوا اسکریپت بیابید.

ایجاد یک شیء پروکسی

در جاوا اسکریپت می توانید با استفاده از سازنده Proxy اشیاء پروکسی ایجاد کنید. این سازنده دو آرگومان می گیرد: یک شی هدف برای پیچیده کردن پراکسی و یک شیء کنترل کننده که ویژگی های آن رفتار پراکسی را هنگام انجام عملیات مشخص می کند.

این آرگومان ها را می گیرد و یک شی ایجاد می کند که می توانید به جای شی هدف استفاده کنید. این شی ایجاد شده می تواند عملیات اصلی مانند گرفتن، تنظیم و تعریف ویژگی ها را دوباره تعریف کند. همچنین می‌توانید از این اشیاء پراکسی برای ثبت دسترسی‌های دارایی و اعتبارسنجی، قالب‌بندی یا پاکسازی ورودی‌ها استفاده کنید.

مثلا:

const originalObject = {
  foo: "bar"
}

const handler = {
  get: function(target, property) {
    return target[property];
  },
  set: function(target, property, value) {
    target[property] = value;
  }
};

const proxy = new Proxy(originalObject, handler)

این کد یک شی هدف، originalObject، با یک ویژگی، foo، و یک شی handler، handler ایجاد می کند. شی handler شامل دو ویژگی get و set است. این خواص به عنوان تله شناخته می شوند.

تله شیء پراکسی تابعی است که هر زمان که یک عمل مشخص را روی یک شیء پراکسی انجام دهید، فراخوانی می شود. تله ها به شما این امکان را می دهند که رفتار شی پراکسی را رهگیری و سفارشی کنید. دسترسی به یک ویژگی از شیء پراکسی، get trap را فراخوانی می‌کند، و تغییر یا دستکاری یک ویژگی از شیء پراکسی، تله set را فراخوانی می‌کند.

مطلب مرتبط:   نحوه ساخت میکروسرویس در پایتون

در نهایت، کد یک شیء پراکسی با سازنده Proxy ایجاد می کند. به ترتیب originalObject و handler را به عنوان شیء هدف و کنترلر ارسال می کند.

استفاده از اشیاء پروکسی

اشیاء پراکسی در جاوا اسکریپت کاربردهای مختلفی دارند که برخی از آنها به شرح زیر است.

افزودن عملکرد به یک شی

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

برای افزودن عملکرد جدید، باید از سازنده پروکسی استفاده کنید و یک یا چند تله برای اقداماتی که می‌خواهید رهگیری کنید، تعریف کنید.

مثلا:

const userObject = {
  firstName: "Kennedy",
  lastName: "Martins",
  age: 20,
};

const handler = {
  get: function (target, property) {
    console.log(`Getting property "${property}"`);
    return target[property];
  },
  set: function (target, property, value) {
    console.log(`Setting property "${property}" to value "${value}"`);
    target[property] = value;
  },
};

const proxy = new Proxy(userObject, handler);

console.log(proxy.firstName); // Getting property "firstName" Kennedy
console.log(proxy.lastName); // Getting property "lastName" Martins
proxy.age = 23; // Setting property "age" to value "23"

این بلوک کد عملکردی را از طریق تله‌های پروکسی، دریافت و تنظیم می‌افزاید. اکنون، هنگامی که می‌خواهید به ویژگی userObject دسترسی داشته باشید یا آن را تغییر دهید، شی پراکسی ابتدا عملیات شما را قبل از دسترسی یا تغییر ویژگی در کنسول ثبت می‌کند.

اعتبارسنجی داده ها قبل از تنظیم روی یک شی

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

مثلا:

const userObject = {
  firstName: "Kennedy",
  lastName: "Martins",
  age: 20,
};

const handler = {
  get: function (target, property) {
    console.log(`Getting property "${property}"`);
    return target[property];
  },
  set: function (target, property, value) {
    if (
      property === "age" &&
      typeof value == "number" &&
      value > 0 &&
      value < 120
    ) {
      console.log(`Setting property "${property}" to value "${value}"`);
      target[property] = value;
    } else {
      throw new Error("Invalid parameter. Please review and correct.");
    }
  },
};

const proxy = new Proxy(userObject, handler);
proxy.age = 21;

این بلوک کد قوانین اعتبارسنجی را به تله مجموعه اضافه می کند. می توانید هر مقداری را به ویژگی age در یک نمونه userObject اختصاص دهید. اما، با قوانین اعتبار سنجی اضافه شده، تنها زمانی می توانید مقدار جدیدی را به ویژگی age اختصاص دهید که عددی بزرگتر از 0 و کمتر از 120 باشد. یک خطا ایجاد می کند و یک پیام خطا چاپ می کند.

مطلب مرتبط:   چگونه با عنصر گفتگوی HTML به راحتی مدال بسازیم

کنترل دسترسی به ویژگی های شی

شما می توانید از اشیاء پروکسی برای مخفی کردن ویژگی های خاص یک شی استفاده کنید. این کار را با تعریف منطق محدودیت در get traps برای ویژگی هایی که می خواهید دسترسی به آنها را کنترل کنید انجام دهید.

مثلا:

const userObject = {
  firstName: "Kennedy",
  lastName: "Martins",
  age: 20,
  phone: 1234567890,
  email: "foo@bar.com",
};

const handler = {
  get: function (target, property) {
    if (property === "phone" || property === "email") {
      throw new Error("Access to info denied");
    } else {
      console.log(`Getting property "${property}"`);
      return target[property];
    }
  },
  set: function (target, property, value) {
    console.log(`Setting property "${property}" to value "${value}"`);
    target[property] = value;
  },
};

const proxy = new Proxy(userObject, handler);

console.log(proxy.firstName); // Getting property "firstName" Kennedy
console.log(proxy.email); // Throws error

بلوک کد بالا محدودیت های خاصی را به دام دریافت اضافه می کند. در ابتدا، می توانید به تمام ویژگی های موجود در userObject دسترسی داشته باشید. قوانین اضافه شده از دسترسی به اطلاعات حساس مانند ایمیل یا تلفن کاربر جلوگیری می کند. تلاش برای دسترسی به هر یک از این ویژگی ها باعث بروز خطا می شود.

سایر تله های پروکسی

تله‌های get و set رایج‌ترین و مفیدترین تله‌ها هستند، اما 11 تله پروکسی جاوا اسکریپت دیگر وجود دارد. آن ها هستند:

  • Apply: وقتی تابعی را روی شی پراکسی فراخوانی می‌کنید، تله اعمال اجرا می‌شود.
  • construct: تله سازه زمانی اجرا می شود که از عملگر جدید برای ایجاد یک شی از شی پراکسی استفاده می کنید.
  • deleteProperty: تله deleteProperty زمانی اجرا می شود که از عملگر delete برای حذف یک ویژگی از شی پراکسی استفاده می کنید.
  • has – زمانی که از عملگر in برای بررسی وجود ویژگی روی شی پراکسی استفاده می کنید، تله has اجرا می شود.
  • ownKeys – وقتی تابع Object.getOwnPropertyNames یا Object.getOwnPropertySymbols را روی شی پراکسی فراخوانی می‌کنید، تله ownKeys اجرا می‌شود.
  • getOwnPropertyDescriptor – تله getOwnPropertyDescriptor زمانی اجرا می شود که تابع Object.getOwnPropertyDescriptor را روی شی پراکسی فراخوانی می کنید.
  • defineProperty – وقتی تابع Object.defineProperty را روی شی پراکسی فراخوانی می کنید، تله defineProperty اجرا می شود.
  • preventExtensions – هنگامی که تابع Object.preventExtensions را در شیء پراکسی فراخوانی می کنید، تله preventExtensions اجرا می شود.
  • isExtensible – هنگامی که تابع Object.isExtensible را روی شی پراکسی فراخوانی می کنید، تله isExtensible اجرا می شود.
  • getPrototypeOf – هنگامی که تابع Object.getPrototypeOf را روی شی پراکسی فراخوانی می کنید، تله getPrototypeOf اجرا می شود.
  • setPrototypeOf – تله setPrototypeOf زمانی اجرا می شود که تابع Object.setPrototypeOf را روی شی پراکسی فراخوانی می کنید.
مطلب مرتبط:   نحوه ساخت Notepad++ مقایسه دو فایل با یک پلاگین

مانند set and get traps، می‌توانید از این تله‌ها برای افزودن لایه‌های جدیدی از عملکرد، اعتبارسنجی و کنترل به شی خود بدون تغییر در اصل استفاده کنید.

معایب اشیاء پروکسی

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

استفاده از اشیاء پروکسی نیز ممکن است دشوار باشد، به خصوص اگر با آنها آشنا نباشید. قبل از استفاده از اشیاء پروکسی در کد خود باید این اشکالات را به دقت در نظر بگیرید.