اذهب إلى المحتوى

السؤال

نشر

عندما أقوم بعمل صنف Class يمكنني عمل تابع ساكن Static Method في هذا الصنف، ولكن كيف أقوم بعمل توابع ساكنة عندما أقوم بعمل دالة بانية Constructor Function بالشكل التالي:

function User(name, email) {
	this.name = name;
	this.email = email;
}

User.sayHi();	// كيف أقوم بعمل مثل هذا التابع

أريد أن يتم عمل تابع ساكن Static Method بحيث يتم إستدعائه بدون عمل كائن جديد (عبر الكلمة المفتاحية new)، كيف أقوم بهذا الأمر؟

Recommended Posts

  • 1
نشر

يمكن عمل توابع ساكنة في لغة JavaScript بأكثر من طريقة:

إنشاء التوابع الساكنة Static Methods في الأصناف Classes

يمكن إستخدام الكلمة المفتاحية static لعمل تابع ساكن Static Method بالشكل التالي:

class User {
  static hello() {
    console.log("Hello");
  }
}

User.hello(); // Hello

كما يمكن إسناد قيمة جديدة للصنف نفسه بشكل مباشرة على النحو التالي:

class User { }

User.hello = function() {
  console.log("Hello");
};

User.hello(); // Hello

يمكن الإطلاع على المقالة التالية التي تحتوي على شرح مفصل لهذا الأمر وكيف يتم إنشاء التوابع بإستخدام prototype خلف الكواليس:

إنشاء التوابع الساكنة Static Methods في الدوال البانية Constructor Function

يمكن عمل توابع ساكنة Static Methods بإستخدام prototype بالشكل التالي:

function Foo() {
    // يمكن إضافة التوابع العادية هنا عبر الكلمة المفتاحية this
}

Foo.prototype = {
    staticMethod: function () {
        return 2 + 3;
    }
};

ويتم إستخدام التابع كما يلي:

var sum = Foo.prototype.staticMethod();
console.log(sum);

لاحظ أنه يمكن إستخدام نفس الطريقة لعمل توابع عادية instance methods بدون مشكلة:

function User() {
    this.age = 23;
}

User.prototype = {
    instanceMethod: function () {
        // instance method
        return this.age * 365;
    },
    staticMethod: function () {
        // static method
        return 2 + 3;
    }
};

ويتم إستخدامهم بالشكل التالي:

var sum = User.prototype.staticMethod();	// 5
var ageInDays = User.prototype.instanceMethod();	// NaN (undefined * 365)


var user = new User();
var ageInDays2 = user.instanceMethod();	// 8395
var sum2 = user.staticMethod();	// 5

يمكن عمل دالة لتبسيط هذه العملية وإضافة توابع بشكل مباشر:

(function (fn) {
     fn.bar = function () { return 123; } ;
     fn.baz = function () { return 456; } ;
})( Foo.prototype );

Foo.prototype.bar();	// 123

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...