Object.prototype
الخاصية Object.prototype
تُمثِّل القيمة الكائن prototype التابعة للكائن Object
.
سمات الخاصية Object.prototype | |
---|---|
قابلة للكتابة | لا |
قابلة للإحصاء | لا |
قابلة للضبط | لا |
الوصف
جميع الكائنات في JavaScript تقريبًا تنحدر من الكائن Object
، والكائنات الاعتيادية ترث الخاصيات (بما في ذلك الدوال) من الكائن Object.prototype
، على الرغم أنَّه يمكن إعادة الكتابة فوق تلك الخاصيات.
قد تُنشَأ كائنات من النوع Object
لا ينطبق فيها ما سبق (مثلًا عبر استخدام الدالة Object.create(null)
) أو يمكن تعديل كائن prototype
مما لا يجعل ما سبق صحيحًا (مثلًا عبر الدالة Object.setPrototypeOf()
).
التغييرات التي تجرى على الكائن prototype
التابع للكائن Object
ستنعكس على جميع الكائنات عبر سلسلة prototype، ما لم تكن تلك الخاصيات والدوال قد عُدِّلَت في نقطةٍ أخرى في سلسلة prototype، وهذا ما يعطينا قدراتٍ وإمكانيات كثيرة، لكنها قد تكون خطيرة إن أُسيئ استخدامها.
الخاصيات
Object.prototype.constructor
تحديد ما هي الدالة التي ستُنشِئ الكائن.
Object.prototype.__proto__
الإشارة إلى الكائن prototype التابعة لنسخة الكائن.
Object.prototype.__noSuchMethod__
السماح بتعريف دالة التي ستُنفَّذ عند محاولة استدعاء خاصية غير موجودة في الكائن. هذه الخاصية غير معيارية وغير مدعومة في أغلبية المتصفحات.
Object.prototype.__count__
كانت تستعمل للحصول على عدد الخاصيات القابلة للإحصاء الموجودة في كائن مُعرَّف من قبل المستخدم، لكن هذه الخاصية محذوفة وغير مدعومة في أي متصفح.
Object.prototype.__parent__
كانت تستعمل للإشارة إلى سياق تنفيذ الكائن (object's context)، لكن هذه الخاصية محذوفة وغير مدعومة في أي متصفح.
الدوال
Object.prototype.__defineGetter__()
ربط دالة مع خاصيةٍ ما، وستُنفَّذ تلك الدالة عند محاولة الوصول إلى تلك الخاصية، وستُعاد القيمة المعادة من الدالة.
Object.prototype.__defineSetter__()
ربط دالة مع خاصيةٍ ما، وستُنفَّذ تلك الدالة عند محاولة تعديل تلك الخاصية.
Object.prototype.__lookupGetter__()
إعادة الدالة المرتبطة مع الخاصية المُحدَّدة باستخدام الدالة __defineGetter__().
Object.prototype.__lookupSetter__()
إعادة الدالة المرتبطة مع الخاصية المُحدَّدة باستخدام الدالة __defineSetter__().
Object.prototype.hasOwnProperty()
إعادة قيمة منطقية تُشير إذا كان الكائن يملك الخاصية المُحدَّدة مباشرةً (أي أنَّه لم يرثها من سلسلة prototype).
Object.prototype.isPrototypeOf()
إعادة قيمة منطقية تُشير إذا كان الكائن التي اُستدعيت الدالة عليه موجودٌ في سلسلة prototype للكائن المُحدَّد.
Object.prototype.propertyIsEnumerable()
إعادة قيمة منطقية تُشير إذا كانت الخاصية (attribute) الداخلية [[Enumerable]]
مضبوطةً.
Object.prototype.toSource()
إعادة سلسلة نصية تحتوي على الشيفرة المصدرية التي تُمثِّل الكائن الذي استدعى هذه الدالة، ويمكن استخدام هذه القيمة لإنشاء كائن جديد. هذه الخاصية محذوفة وغير مدعومة في أغلبية المتصفحات.
Object.prototype.toString()
إعادة تمثيل نصيّ للكائن.
Object.prototype.unwatch()
إزالة نقطة مراقبة (watchpoint) من إحدى خاصيات الكائن. هذه الخاصية محذوفة وغير مدعومة في جميع المتصفحات.
Object.prototype.valueOf()
إعادة القيمة الأوليّة للكائن المُحدَّد.
Object.prototype.watch()
إضافة نقطة مراقبة (watchpoint) إلى إحدى خاصيات الكائن. هذه الخاصية محذوفة وغير مدعومة في جميع المتصفحات.
Object.prototype.eval()
تقدير قيمة شيفرة JavaScript في سياق تنفيذ الكائن الحالي. هذه الخاصية محذوفة وغير مدعومة في جميع المتصفحات، ويجب استخدام الدالة eval()
بدلًا منها.
أمثلة
لمّا كانت JavaScript لا تحتوي على كائنات من صنفٍ فرعي (sub-class objects)، فمن الممكن استخدام prototype كحلٍّ التفافي بإنشاء كائن يُمثِّل «صنف أساس» (base class). مثلًا:
var Person = function(name) {
this.name = name;
this.canTalk = true;
};
Person.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
};
var Employee = function(name, title) {
Person.call(this, name);
this.title = title;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
};
var Customer = function(name) {
Person.call(this, name);
};
Customer.prototype = Object.create(Person.prototype);
Customer.prototype.constructor = Customer;
var Mime = function(name) {
Person.call(this, name);
this.canTalk = false;
};
Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime;
var bob = new Employee('Bob', 'Builder');
var joe = new Customer('Joe');
var rg = new Employee('Red Green', 'Handyman');
var mike = new Customer('Mike');
var mime = new Mime('Mime');
bob.greet();
// Hi, I am Bob, the Builder
joe.greet();
// Hi, I am Joe
rg.greet();
// Hi, I am Red Green, the Handyman
mike.greet();
// Hi, I am Mike
mime.greet();
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 1st Edition .