الفرق بين المراجعتين لصفحة: «JavaScript/Object/prototype»

من موسوعة حسوب
 
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
سطر 142: سطر 142:
*معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.1 ECMAScript 5.1].
*معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.1 ECMAScript 5.1].
*معيار [http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf ECMAScript 1st Edition] .
*معيار [http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf ECMAScript 1st Edition] .
[[تصنيف:JavaScript]]
[[تصنيف:JavaScript|{{SUBPAGENAME}}]]
[[تصنيف:JavaScript Global Objects]]
[[تصنيف:JavaScript Global Objects|{{SUBPAGENAME}}]]
[[تصنيف:JavaScript Object]]
[[تصنيف:JavaScript Object|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 15:43، 28 يناير 2018

الخاصية 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
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات