Object.prototype.constructor

من موسوعة حسوب

الخاصية Object.prototype.constructor تُعيد مرجعيةً إلى الدالة البانية Object التي تُنشِئ نسخةً (instance) من الكائن؛ لاحظ أنَّ قيمة هذه الخاصية تُشير إلى الدالة نفسها وليست سلسلةً نصيةً تحتوي على اسم الدالة؛ وتكون هذه القيمة للقراءة فقط في القيم الأوليّة مثل 1 و true و "test".

الوصف

جميع الكائنات تملك الخاصية constructor، والكائنات المُنشأة دون استخدام الدالة البانية مباشرةً (أي الشكل المختصرة لإنشاء الكائنات والمصفوفات) ستملك الخاصية constructor التي تُشير إلى الدالة البانية الأساسية لنوع الكائنات التي تتبع له.

var o = {};
o.constructor === Object; // true

var o = new Object;
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

var a = new Array;
a.constructor === Array // true

var n = new Number(3);
n.constructor === Number; // true

أمثلة

عرض الدالة البانية للكائن

المثال الآتي يُنشِئ الدالة البانية Tree وسيُهيّئ كائنًا من ذلك النوع باسم theTree، ثم سيعرض قيمة الخاصية constructor للكائن theTree:

function Tree(name) {
  this.name = name;
}

var theTree = new Tree('Redwood');
console.log('theTree.constructor is ' + theTree.constructor);

ناتج تنفيذ الشيفرة السابقة:

theTree.constructor is function Tree(name) {
  this.name = name;
}

تغيير الدالة البانية لأحد الكائنات

يُظهِر المثال الآتي كيفية تعديل قيمة الخاصية constructor للكائنات المضمَّنة في اللغة، لاحظ أنَّ القيم true و 1 و "test" لن تتأثر في المثال الآتي لأنها تملك دوالًا بانيةً للقراءة فقط، والمثال الآتي يبيّن أنَّه من غير الآمن الاعتماد كليًّا على الخاصية constructor لأحد الكائنات:

function Type () {}

var types = [
  new Array(),
  [],
  new Boolean(),
  true,             // لن تتأثر
  new Date(),
  new Error(),
  new Function(),
  function () {},
  Math,
  new Number(),
  1,                // لن تتأثر
  new Object(),
  {},
  new RegExp(),
  /(?:)/,
  new String(),
  'test'            // لن تتأثر
];

for (var i = 0; i < types.length; i++) {
  types[i].constructor = Type;
  types[i] = [types[i].constructor, types[i] instanceof Type, types[i].toString()];
}

console.log(types.join('\n'));

سيُظهِر المثال السابق الناتج الآتي:

function Type() {},false,
function Type() {},false,
function Type() {},false,false
function Boolean() {
    [native code]
},false,true
function Type() {},false,Mon Sep 01 2014 16:03:49 GMT+0600
function Type() {},false,Error
function Type() {},false,function anonymous() {

}
function Type() {},false,function () {}
function Type() {},false,[object Math]
function Type() {},false,0
function Number() {
    [native code]
},false,1
function Type() {},false,[object Object]
function Type() {},false,[object Object]
function Type() {},false,/(?:)/
function Type() {},false,/(?:)/
function Type() {},false,
function String() {
    [native code]
},false,test

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

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