الدوال الثابتة في لغة JavaScript


الدوال الثابتة في لغة JavaScript

يا هلا والله! اليوم بنتكلم عن الدوال الثابتة (Static Methods) في جافاسكريبت. الموضوع بسيط وما يحتاج تعقيد، هي دوال تنتمي للكلاس نفسه مو للكائنات (Instances) اللي تنشئها من الكلاس.

إيش يعني "تنتمي للكلاس نفسه"؟

يعني ما تحتاج تسوي new ClassName() عشان تستدعيها. تستدعيها مباشرة على اسم الكلاس. تخيل عندك كلاس اسمه Math، دالة زي Math.random() أو Math.max()، هذي دوال ثابتة. أنت ما تسوي new Math() عشان تستخدمها صح؟ نفس الفكرة.

متى أحتاج أستخدمها؟

  • لما تكون الدالة تسوي عملية ما تحتاج بيانات خاصة بكائن معين.
  • دوال المساعدة (Utility functions) اللي تتعامل مع الكلاس بشكل عام أو تسوي عمليات عامة.
  • دوال إنشاء الكائنات (Factory methods) اللي ترجع لك كائن من نوع معين بناءً على مدخلات.

كيف تعرف دالة ثابتة؟

ببساطة، تستخدم الكلمة المفتاحية static قبل اسم الدالة داخل الكلاس.


class MyClass {
  constructor(value) {
    this.value = value;
  }

  // دالة عادية (Instance method)
  greet() {
    return Hello from instance with value: ${this.value};
  }

  // دالة ثابتة (Static method)
  static staticGreet(name) {
    return Hello, ${name}! This is a static greeting.;
  }
}

// استدعاء دالة الكائن
const instance = new MyClass(10);
console.log(instance.greet()); // Hello from instance with value: 10

// استدعاء الدالة الثابتة
console.log(MyClass.staticGreet("Ali")); // Hello, Ali! This is a static greeting.

// لو حاولت تستدعي الدالة الثابتة عن طريق الكائن بيطلع لك خطأ
// console.log(instance.staticGreet("Ali")); // TypeError: instance.staticGreet is not a function

// ولو حاولت تستدعي دالة الكائن عن طريق الكلاس بيطلع لك خطأ
// console.log(MyClass.greet()); // TypeError: MyClass.greet is not a function

مثال ثاني: دالة مساعدة (Utility Function)

تخيل عندك كلاس للمساعدة في عمليات حسابية بسيطة:


class Calculator {
  static add(a, b) {
    return a + b;
  }

  static subtract(a, b) {
    return a - b;
  }

  static multiply(a, b) {
    return a * b;
  }
}

console.log(Calculator.add(5, 3));      // 8
console.log(Calculator.subtract(10, 4)); // 6
console.log(Calculator.multiply(2, 6));  // 12

ملاحظة مهمة: داخل الدالة الثابتة، ما تقدر توصل لـ this الخاص بالكائن. لأنها ما تنتمي لكائن معين أساساً. لو احتجت بيانات، لازم تمررها كـ arguments.

وبس والله، هذي هي الدوال الثابتة بكل بساطة. فكر فيها كدوال عامة مرتبطة بكلاس معين، مو بكائن معين من الكلاس.