جاوااسکریپت دارای رفتارهای خاصی در مقایسههای شرطی و ساختارهای شیگرا است. در این مقاله، دو موضوع مهم بررسی میشود: مقایسههای شرطی تبدیلپذیر و کلاسهای پروتوتایپی که پیشزمینهای برای کلاسهای مدرن ES6 هستند.
عبارات شرطی مانند if، while و ?: در JS بهصورت ضمنی مقادیر را به boolean تبدیل میکنند. این تبدیل نوع باعث میشود مقایسهها بهصورت تبدیلپذیر انجام شوند، نه دقیق.
var x = 1;
if (x) { /* runs */ }
var x = "hello";
if (x) { /* runs */ }
if (x == true) { /* doesn't run */ }در واقع، شرط if (x) معادل if (Boolean(x) === true) است. بنابراین، تبدیل نوع به boolean قبل از مقایسه انجام میشود.
قبل از معرفی class در ES6، الگوی رایج برای ساخت کلاسها استفاده از prototype بود. این الگو بهصورت زیر تعریف میشد:
function Classroom() {}
Classroom.prototype.welcome = function() {
console.log("Welcome, students!");
};
var mathClass = new Classroom();
mathClass.welcome(); // Welcome, students!تابع Classroom دارای شیء prototype است که متد welcome را نگه میدارد. شیء mathClass از طریق new ساخته شده و به Classroom.prototype لینک شده است.
var Classroom = {
welcome() {
console.log("Welcome, students!");
}
};
var mathClass = Object.create(Classroom);
mathClass.welcome(); // Welcome, students!در این روش، شیء mathClass مستقیماً به Classroom لینک میشود و رفتار را از آن دریافت میکند.
با معرفی class در ES6، ساختار کلاسها خواناتر و منظمتر شد:
class Classroom {
constructor() {}
welcome() {
console.log("Welcome, students!");
}
}
var mathClass = new Classroom();
mathClass.welcome(); // Welcome, students!در پشتصحنه، همان لینک پروتوتایپی برقرار است، اما نحو کلاسها با الگوی شیگرا سازگارتر است.
درک رفتار تبدیلپذیر در مقایسههای شرطی و شناخت الگوهای مختلف ساخت کلاسها در جاوااسکریپت، پایهای مهم برای نوشتن کدهای قابلپیشبینی و قابلنگهداری است. چه از کلاسهای مدرن استفاده کنید، چه از الگوهای پروتوتایپی، مهم است که منطق پشت تفویض رفتار و ساختار حافظه را بشناسید.