Ù٠أÙÙ ÙØµÙ Ù Ù ÙØ°Ø§ Ø§ÙØ¬Ø²Ø¡ تÙÙÙ ÙØ§ ع٠أ٠ÙÙØ§Ù Ø¯ÙØ§Ù Ø¬Ø¯ÙØ¯Ø© ÙØ¹Ù Ù ÙÙ ÙØ°Ø¬ (prototype).
تعتبر Ø§ÙØ®Ø§ØµÙØ© __proto__ ÙØ¯ÙÙ
Ø© ÙØºÙر Ù
دعÙÙ
Ø© (Ù٠عÙ
Ù Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ù٠اÙÙ
ØªØµÙØØ§Øª ÙÙØ·).
Ø§ÙØ¯ÙØ§Ù Ø§ÙØØ¯ÙØ«Ø© ÙÙ:
The modern methods are:
- Object.create(proto, [descriptors]) â creates an empty object with given
protoas[[Prototype]]and optional property descriptors. - Object.getPrototypeOf(obj) â returns the
[[Prototype]]ofobj. - Object.getPrototypeOf(obj) â ØªÙÙÙ
بإرجاع Ø§ÙØ®Ø§ØµÙØ©
[[Prototype]]٠٠اÙÙØ§Ø¦Ùobj. - Object.setPrototypeOf(obj, proto) â ØªØ¬Ø¹Ù Ø§ÙØ®Ø§ØµÙØ©
[[Prototype]]٠٠اÙÙØ§Ø¦ÙobjØªØ´ÙØ± Ø¥ÙÙproto.
ÙÙØ°Ù Ø§ÙØ¯ÙØ§Ù ÙØ¬Ø¨ استخداÙ
ÙØ§ بÙÙØ§ Ù
Ù __proto__.
Ø¹Ù ÙØ³Ø¨Ù٠اÙ٠ثاÙ:
let animal = {
eats: true
};
// تÙÙÙ
Ø¨Ø¥ÙØ´Ø§Ø¡ ÙØ§Ù Ø¬Ø¯ÙØ¯ ØÙØ« أ٠اÙÙØ§Ø¦Ù animal ÙÙ
ÙØ°Ø¬ ÙÙ
let rabbit = Object.create(animal);
alert(rabbit.eats); // true
alert(Object.getPrototypeOf(rabbit) === animal); // true
Object.setPrototypeOf(rabbit, {}); // تغÙÙØ± ÙÙ
ÙØ°Ø¬ اÙÙØ§Ø¦Ù rabbit Ø¥ÙÙ {}
ØªØ³ØªÙØ¨Ù Ø§ÙØ¯Ø§ÙØ© Object.create Ù
ØªØºÙØ±Ùا إضاÙÙÙØ§ بشÙÙ Ø§Ø®ØªÙØ§Ø±Ù ÙÙÙ ÙØ§ØµÙ Ø§ÙØ®Ø§ØµÙØ© (property descriptors) ØÙØ« ÙÙ
ÙÙÙØ§ Ø¥Ø¶Ø§ÙØ© خصائص إضاÙÙØ© ÙÙÙØ§Ø¦Ù Ø§ÙØ¬Ø¯Ùد ÙØ§ÙآتÙ:
let animal = {
eats: true,
};
let rabbit = Object.create(animal, {
jumps: {
value: true,
},
});
alert(rabbit.jumps); // true
ÙØªÙÙ٠اÙÙØ§ØµÙات عÙÙ ÙÙØ³ Ø§ÙØ·Ø±ÙÙØ© اÙÙ ÙØµÙÙØ© سابÙÙØ§ ÙÙ ÙØµÙ Ø±Ø§ÙØ§Øª Ø§ÙØ®ØµØ§Ø¦Øµ Ù ÙØ§ØµÙØ§ØªÙØ§.
ÙÙ
ÙÙÙØ§ استخداÙ
Object.create ÙÙÙÙØ§Ù
Ø¨ÙØ³Ø® ÙØ§Ø¦Ù بشÙÙ Ø£ÙØ¶Ù Ù
Ù ÙØ³Ø® Ø§ÙØ®ØµØ§Ø¦Øµ باستخداÙ
Ø§ÙØªÙرار for..in:
// ÙØ§Ø¦Ù Ø¬Ø¯ÙØ¯ Ù
Ù
اث٠تÙ
اÙ
ÙØ§
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
ÙØ°Ø§ Ø§ÙØ¥Ø³ØªØ¯Ø¹Ø§Ø¡ ÙÙÙÙ
Ø¨Ø¥ÙØ´Ø§Ø¡ ÙØ³Ø®Ù Ø·Ø¨Ù Ø§ÙØ£ØµÙ Ù
٠اÙÙØ§Ø¦Ù obj بÙ
ا ÙÙÙ Ù
٠خصائص Ø³ÙØ§Ø¡Ùا ÙØ§Ùت Ù
Ø¹Ø¯ÙØ¯Ø© (enumerable) Ø£Ù
ÙØ§ ÙÙØ°ÙÙ Ø§ÙØ¬Ø§Ùبات ÙØ§ÙÙ
ØºÙØ±Ø§Øª (getters & setters) â ÙÙ Ø´ÙØ¦ ÙØ¨Ø§ÙØ®Ø§ØµÙØ© [[Prototype]] Ø§ÙØµØÙØØ©.
ÙØ¨Ø°Ø© Ù Ù Ø§ÙØªØ§Ø±ÙØ®
إذا Ø¹Ø¯Ø¯ÙØ§ ÙÙ Ø§ÙØ·Ø±Ù ÙÙØªØÙÙ
ÙÙ [[Prototype]]Ø ÙÙÙØ§Ù اÙÙØ«Ùر! ØªÙØ¬Ø¯ اÙÙØ«Ùر Ù
Ù Ø§ÙØ·Ø±Ù ÙÙÙÙØ§Ù
بÙÙØ³ Ø§ÙØ´Ùئ!
Ù٠اذاØ
ÙØ°Ø§ ÙØ£Ø³Ø¨Ø§Ø¨ ØªØ§Ø±ÙØ®ÙØ© ٠تأصÙÙØ©.
- Ø®Ø§ØµÙØ© اÙ
"prototype"ÙØ¯Ø§ÙØ© باÙÙØ© (constructor function) Ù ÙØ¬Ùدة Ù Ù Ø²Ù Ø§Ù Ø¨Ø¹ÙØ¯. - ÙØ§ØÙÙØ§ Ù٠عاÙ
2012 Ø¸ÙØ±Øª Ø§ÙØ¯Ø§ÙØ©
Object.create. ØÙØ« ت٠ÙÙÙÙ Ù Ù Ø¥ÙØ´Ø§Ø¡ ÙØ§Ø¦Ùات بÙÙ ÙØ°Ø¬ Ù ÙØ¹Ø·Ù ÙÙÙÙ ÙØ§ ØªØ¹Ø·Ù Ø§ÙØ¥Ù ÙØ§ÙÙØ© ÙØ¬Ùب أ٠تعدÙÙ Ø§ÙØ®ØµØ§Ø¦ØµØ ÙÙØ°ÙÙ ÙØ§Ù ت اÙÙ ØªØµÙØØ§Øª Ø¨Ø¥Ø¶Ø§ÙØ© Ø§ÙØ®Ø§ØµÙØ©__proto__Ø§ÙØºÙر Ù ÙØ«ÙØ© Ù٠اÙ٠صدر ÙØ§ÙØªÙ ØªØ³Ù Ø ÙÙÙ Ø³ØªØ®Ø¯Ù Ø£Ù ÙØ¬Ùب Ø£Ù ÙØ¹Ø¯Ù اÙÙÙ ÙØ°Ø¬ Ù٠أ٠ÙÙØª. - ÙØ§ØÙÙØ§ Ù٠عاÙ
2015 Ø¸ÙØ±Øª Ø§ÙØ¯Ø§ÙتÙÙ
Object.setPrototypeOfÙObject.getPrototypeOfÙÙÙÙØ§Ù بÙÙØ³ ÙØ¸ÙÙØ© Ø§ÙØ®Ø§ØµÙØ©__proto__ÙØÙØ« Ø£Ù Ø§ÙØ®Ø§ØµÙØ©__proto__Ù ÙØ¬Ùدة ÙÙ ÙÙ Ù ÙØ§Ù ØªÙØ±ÙØ¨ÙØ§ ÙÙØ¯ Ø£ØµØ¨ØØª ÙØ¯ÙÙ Ø© ÙØ£ØµØ¨ØØª Ù٠طرÙÙÙØ§ Ø¥ÙÙ (Annex B) ٠٠اÙ٠صدر ÙØ¨Ø§ÙتاÙÙ Ø£ØµØ¨ØØª Ø§Ø®ØªÙØ§Ø±ÙØ© ÙØ¨Ùئة Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ØºÙØ± اÙÙ ØªØµÙØØ§Øª.
ÙØ§ÙØ¢Ù Ø£ØµØ¨Ø Ù٠تصرÙÙØ§ ÙÙ ÙØ°Ù Ø§ÙØ·Ø±Ù.
ÙÙ
اذا تÙ
Ø§Ø³ØªØ¨Ø¯Ø§Ù Ø§ÙØ®Ø§ØµÙØ© __proto__ Ø¨Ø§ÙØ¯Ùا٠getPrototypeOf/setPrototypeOfØ ÙØ°Ø§ سؤا٠Ù
ÙÙ
ÙÙØ³ØªØ¯Ø¹ÙÙØ§ Ø£Ù ÙÙÙÙ
ÙÙ
اذا تعد Ø§ÙØ®Ø§ØµÙØ© __proto__ Ø³ÙØ¦Ø©. Ø£ÙÙ
٠اÙÙØ±Ø§Ø¡Ø© ÙØªØØµÙ عÙÙ Ø§ÙØ¥Ø¬Ø§Ø¨Ø©.
[[Prototype]]ÙÙ ÙØ§Ø¦Ù Ù
ÙØ¬Ùد إذا ÙØ§Ùت Ø§ÙØ³Ø±Ø¹Ø© تÙÙ
ÙÙÙ
ØØ±Ùات Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ø¬Ø§ÙØ²Ø© ÙÙØªØ¹Ø§Ù
Ù Ù
ع ذÙ٠بسرعة ÙØ§Ø¦ÙØ©. ÙØªØºÙÙØ± اÙÙÙ
ÙØ°Ø¬ ÙÙØª Ø§ÙØªÙÙÙØ° باستخداÙ
Object.setPrototypeOf Ø£Ù obj.__proto__= Ø¨Ø·ÙØ¦ Ø¬Ø¯ÙØ§ ÙÙØ¨Ø·Ø¦ عÙ
ÙÙØ© Ø§Ø³ØªØ¬ÙØ§Ø¨ Ø§ÙØ®ØµØ§Ø¦Øµ. ÙÙØ°ÙÙ ØªØ¬ÙØ¨ ذÙÙ Ø¥ÙØ§ إذا ÙÙØª تعر٠Ù
اذا ØªÙØ¹Ù Ø£Ù Ø£Ù Ø§ÙØ³Ø±Ø¹Ø© ÙØ§ تÙÙ
Ù.
اÙÙØ§Ø¦Ùات "Ø§ÙØ¹Ø§Ø¯ÙØ© Ø¬Ø¯ÙØ§"
Ù٠ا ÙØ¹ÙÙ Ø ÙØ¥ÙÙ ÙÙ Ù٠استخدا٠اÙÙØ§Ø¦Ùات ÙÙÙØ§Ø¦Ù ٠ترابطة ÙØªØ®Ø²ÙÙ Ø®Ø§ØµÙØ© بÙÙÙ ØªÙØ§.
â¦ÙÙÙ٠إذا ØØ§ÙÙÙØ§ Ø£Ù ÙØ®Ø²Ù خصائص Ø£Ø¹Ø·Ø§ÙØ§ اÙÙ
ستخدÙ
ÙÙÙØ§ ÙÙÙ
ÙÙÙØ§ Ø£Ù ÙØ±Ù Ø®ÙÙÙØ§ Ù
ÙÙ
ÙØ§: ÙÙ Ø§ÙØ®ØµØ§Ø¦Øµ تعÙ
Ù Ø¬ÙØ¯Ùا عدا "__proto__".
Ø£ÙØ¸Ø± Ø¥ÙÙ ÙØ°Ø§ اÙ٠ثاÙ:
let obj = {};
let key = prompt("What's the key?", "__proto__");
obj[key] = "some value";
alert(obj[key]); // [object Object], ÙÙÙØ³Øª "some value"!
ÙÙØ§ إذا ÙØ§Ù
اÙÙ
ستخدÙ
Ø¨ÙØªØ§Ø¨Ø© __proto__Ø ÙØ¥Ù Ù
Ø§ÙØªØ¨Ù Ø³ÙØªÙ
تجاÙÙÙ!
ÙØ°Ø§ ÙØ§ ÙØ¬Ø¨ Ø£Ù ÙÙØ§Ø¬Ø¦ÙØ§Ø ÙØ§ÙØ®Ø§ØµÙØ© __proto__ ÙÙØ§ تعاÙ
٠خاص: ÙØ£ÙÙØ§ ÙØ¬Ø¨ أ٠تÙÙÙ ÙØ§Ø¦ÙÙØ§ Ø£Ù nullØ ÙÙØ§ ÙÙ
Ù٠أ٠ÙÙÙ٠اÙÙØµ ÙÙ
ÙØ°Ø¬Ùا.
ÙÙÙÙÙØ§ ÙÙ
ÙÙØµØ¯ Ø£Ù ÙÙØ¹Ù ذÙÙØ Ø£ÙÙØ³ ÙØ°ÙÙØ ÙØ±Ùد Ø£Ù ÙØ®Ø²Ù Ø®Ø§ØµÙØ© بÙÙÙ
ØªÙØ§ ÙØ§Ø³Ù
Ø§ÙØ®Ø§ØµÙØ© "__proto__" ÙÙ
ÙØªÙ
ØÙظÙ. ÙÙØ°Ø§ إذ٠خÙÙ!
Ø§ÙØ¢Ø«Ø§Ø± ÙÙØ§ ÙÙØ³Øª ÙØ§Ø±Ø«ÙØ©Ø ÙÙÙÙ ÙÙ ØØ§Ùات أخر٠ÙÙ ÙÙ Ø£Ù ÙØ¶Ø¹ Ø®Ø§ØµÙØ© بÙÙÙ ØªÙØ§ Ø«Ù ÙØªØºÙر اÙÙÙ ÙØ°Ø¬ باÙÙØ¹Ù. ÙÙØªÙجة ÙØ°ÙÙ Ø³ÙØ¹Ø·Ù Ø§ÙØªÙÙÙØ° ÙØªØ§Ø¦Ø¬ ØºÙØ± صØÙØØ© ÙØºÙر ٠تÙÙØ¹Ø©.
ÙØ£Ø³ÙØ£ ٠٠ذÙÙ â ÙØ§ ÙÙÙØ± اÙÙ Ø·ÙØ±Ù٠عادة Ø¹Ù Ø¥Ù ÙØ§ÙÙØ© ÙÙØ°Ù Ø£Ø¨Ø¯ÙØ§. ÙÙØ°Ø§ ÙØ¬Ø¹Ù Ø§ÙØ®Ø·Ø£ صعب اÙÙ ÙØ§ØØ¸Ø© ÙÙÙ ÙÙ Ø£Ù ÙØªØÙ٠إÙ٠ثغرة Ø®ØµÙØµÙا إذا ÙØ§Ù Ø§ÙØ¨Ø±Ùا٠ج ÙØ¹Ù ٠عÙÙ Ø§ÙØ³ÙØ±ÙØ±.
ÙÙÙ
ÙÙ Ø£Ù ØªØØ¯Ø« Ø£ÙØ¶Ùا Ø£Ø´ÙØ§Ø¡ ØºÙØ± Ù
تÙÙØ¹Ø© Ø¹ÙØ¯ ÙØ¶Ø¹ ÙÙÙ
Ø© ÙÙØ¯Ø§ÙØ© toString ÙØ§Ùت٠ÙÙ Ø¯Ø§ÙØ© Ø¨Ø·Ø¨ÙØ¹ØªÙا ÙÙØ°ÙÙ ÙØ¯Ùا٠أخرÙ.
ÙÙÙ ÙÙ ÙÙÙØ§ ØªØ¬ÙØ¨ ÙØ°Ù اÙÙ Ø´ÙÙØ©Ø
Ø£ÙÙÙØ§Ø ÙÙ
ÙÙÙØ§ Ø£Ù ÙØªØÙÙÙ ÙØ§Ø³ØªØ®Ø¯Ø§Ù
اÙÙMap ÙÙØªØ®Ø²Ù٠بدÙÙØ§ Ù
٠اÙÙØ§Ø¦Ùات Ø§ÙØ¹Ø§Ø¯ÙØ© ÙØ³ÙÙÙÙ ÙÙ Ø´ÙØ¦ Ø¨Ø®ÙØ±.
ÙÙÙÙ ÙÙ
ÙÙ ÙÙÙ Object Ø£Ù ÙØ®Ø¯Ù
ÙØ§ بشÙÙ Ø¬ÙØ¯ ÙÙØ§Ø ÙØ£Ù صÙÙØ§Ø¹ اÙÙØºØ© Ø£Ø¹Ø·Ù Ø§ÙØªÙ
اÙ
ÙØ§ ÙÙØ°Ù اÙÙ
Ø´ÙÙØ© Ù
Ù ÙÙØª Ø·ÙÙÙ.
Ø¥Ù Ø§ÙØ®Ø§ØµÙØ© __proto__ ÙÙØ³Øª Ø¨Ø®Ø§ØµÙØ© Ø¹Ø§Ø¯ÙØ© ÙØ¥ÙÙ
ا Ù
ÙØµÙÙ ÙÙØ®Ø§ØµÙØ© Object.prototype:
ÙÙØ°Ù٠إذا ÙØ§Ù استخداÙ
obj.__proto__ ÙÙÙØ±Ø§Ø¡Ø© Ø£Ù Ø§ÙØªØ¹Ø¯ÙÙ ÙØ¥Ù Ø§ÙØ¬Ø§Ùب أ٠اÙÙ
عدÙ٠اÙÙ
ÙØ§Ø³Ø¨ Ø³ÙØªÙ
استدعاؤ٠Ù
٠اÙÙÙ
ÙØ°Ø¬ ÙØ³ØªÙÙÙ
Ø¨Ø¬ÙØ¨ أ٠تعدÙÙ Ø§ÙØ®Ø§ØµÙØ© [[Prototype]].
ÙÙ
ا ÙÙÙ ÙÙ Ø¨Ø¯Ø§ÙØ© ÙØ°Ø§ Ø§ÙØ¬Ø²Ø¡: __proto__ Ù٠طرÙÙØ© ÙÙÙØµÙ٠إÙÙ Ø§ÙØ®Ø§ØµÙØ© [[Prototype]] ÙÙÙØ³Øª Ø§ÙØ®Ø§ØµÙØ© [[Prototype]] بÙÙØ³Ùا.
ÙØ§Ùآ٠إذا Ø£Ø±Ø¯ÙØ§ Ø£Ù ÙØ³ØªØ®Ø¯Ù اÙÙØ§Ø¦Ù ÙÙØ§Ø¦Ù Ø© ٠ترابطة ÙØ®Ø§ÙÙØ© ٠٠٠شاÙÙ ÙÙØ°ÙØ ÙÙ ÙÙÙØ§ Ø£Ù ÙÙØ¹Ù ذÙ٠بØÙÙØ© Ø¨Ø³ÙØ·Ø©:
let obj = Object.create(null);
let key = prompt("What's the key?", "__proto__");
obj[key] = "some value";
alert(obj[key]); // "some value"
ØªÙØ´Ø¦ Object.create(null) ÙØ§Ø¦ÙÙØ§ ÙÙØ³ ÙÙ ÙÙ
ÙØ°Ø¬ ([[Prototype]] ÙÙÙ
ØªÙØ§ null):
ÙÙØ°ÙÙ ÙÙØ³ ÙÙØ§Ù Ø¬Ø§ÙØ¨ Ø£Ù Ù
عد٠Ù
ÙØ±ÙØ« ÙÙ __proto__. ÙØ§ÙØ¢Ù ÙÙ
ÙÙ Ø§ÙØªØ¹Ø§Ù
Ù Ù
Ø¹ÙØ§ ÙØ®Ø§ØµÙØ© Ø¹Ø§Ø¯ÙØ© ÙØ³ÙعÙ
٠اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù بشÙ٠صØÙØ.
ÙÙ
ÙÙÙØ§ Ø£Ù ÙØ¯Ø¹Ù ÙØ°Ø§ اÙÙØ§Ø¦Ù âØ¹Ø§Ø¯Ù Ø¬Ø¯ÙØ§â Ø£Ù âvery plainâ Ø£Ù âpure dictionaryâ ÙØ£ÙÙÙ
أبسط Ù
٠اÙÙØ§Ø¦Ù Ø§ÙØ¹Ø§Ø¯Ù اÙÙ
عرÙÙ {...}.
ÙÙÙÙ Ø§ÙØ¹Ùب ÙÙ ÙØ°Ø§ Ø£Ù ÙØ°Ø§ اÙÙØ§Ø¦Ù ÙØ§ ÙØØªÙ٠بعض Ø§ÙØ¯Ùا٠اÙÙ
ÙØ¬Ùدة باÙÙØ¹Ù Ù
ث٠toString:
let obj = Object.create(null);
alert(obj); // Error (no toString)
â¦ÙÙÙ٠عادة٠٠ا ÙÙÙÙ ÙØ°Ø§ Ø¬ÙØ¯Ùا ÙÙÙÙØ§Ø¦Ù اÙ٠ترابطة.
ÙØ§ ØØ¸ Ø£Ù Ø£ØºÙØ¨ Ø§ÙØ¯Ùا٠اÙÙ
تعÙÙØ© باÙÙØ§Ø¦Ù تتبع Ø§ÙØµÙغة Object.something(...), Ù
ث٠Object.keys(obj) â ÙÙÙ
ÙÙØ³Ù Ù٠اÙÙÙ
ÙØ°Ø¬ ÙÙØ°ÙÙ Ù
ازا٠ÙÙ
Ù٠استخداÙ
ÙÙ
Ù
ع ÙØ§Ø¦Ùات ÙÙØ°Ù:
let chineseDictionary = Object.create(null);
chineseDictionary.hello = 'ä½ å¥½';
chineseDictionary.bye = 'åè§';
alert(Object.keys(chineseDictionary)); // hello,bye
اÙÙ ÙØ®Øµ
Ø§ÙØ¯ÙØ§Ù Ø§ÙØØ¯ÙØ«Ø© ÙØ¥Ùشاء ÙÙ ÙØ°Ø¬ ٠اÙÙØµÙ٠إÙÙÙ ÙÙ:
- Object.create(proto, [descriptors]) â creates an empty object with a given
protoas[[Prototype]](can benull) and optional property descriptors. - Object.getPrototypeOf(obj) â returns the
[[Prototype]]ofobj(same as__proto__getter). - Object.setPrototypeOf(obj, proto) â sets the
[[Prototype]]ofobjtoproto(same as__proto__setter).
Ù __proto__ اÙÙ
ÙØ¬Ùدة باÙÙØ¹Ù ÙØ§Ùت٠تÙÙÙ
Ø¨Ø¬ÙØ¨ أ٠تعدÙÙ Ø§ÙØ®ØµØ§Ø¦Øµ ÙÙØ³Øª Ø¢Ù
ÙØ© ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
إذا ÙÙØ§ ÙØ±Ùد Ø£Ù ÙÙØ´Ø¦ خصائص بأسÙ
اء ÙØ¹Ø·ÙÙØ§ اÙÙ
ستخدÙ
ÙÙÙØ§Ø¦Ù ÙØ°ÙÙ ÙØ£Ù اÙÙ
ستخدÙ
ÙÙ
Ù٠أ٠ÙÙØ¯Ø®Ù اسÙ
Ø§ÙØ®Ø§ØµÙØ© ÙÙ "__proto__" ÙØ³ÙÙÙÙ ÙÙØ§Ù Ø®Ø·Ø£ÙØ§ ÙØ¨Ø¢Ø«Ø§Ø± ÙÙØªØ§Ø¦Ø¬ ØºÙØ± Ù
تÙÙØ¹Ø©.
ÙØ°Ø§ ÙÙ
ÙÙÙØ§ استخداÙ
Object.create(null) ÙØ¥Ùشاء ÙØ§Ø¦Ù Ø¹Ø§Ø¯Ù Ø¬Ø¯ÙØ§ âvery plainâ Ø¨Ø¯ÙÙ __proto__ أ٠استخداÙ
اÙÙ Map ÙÙØ°Ø§.
ÙØ£ÙØ¶ÙØ§Ø ØªØ¹Ø·Ù Ø§ÙØ¯Ø§ÙØ© Object.create طرÙÙØ© سÙÙ ÙÙØ³Ø® اÙÙØ§Ø¦Ù بÙ٠اÙÙØ§ØµÙات (descriptors):
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
ÙÙØ¯ Ø£ÙØ¶ØÙا Ø£ÙØ¶Ùا Ø£Ù __proto__ ÙÙ Ø¬Ø§ÙØ¨ Ø£Ù Ù
عدÙÙ ÙÙØ®Ø§ØµÙØ© [[Prototype]] ÙÙÙØ¬Ø¯ ÙÙ Object.prototype Ù
Ø«Ù ØºÙØ±Ù Ù
Ù Ø§ÙØ¯ÙاÙ.
ÙÙÙ
ÙÙÙØ§ Ø£Ù ÙÙØ´Ø¦ ÙØ§Ø¦ÙÙØ§ Ù
Ù ØºÙØ± ÙÙ
ÙØ°Ø¬ باستخداÙ
Object.create(null)Ø ÙÙØ°Ù اÙÙØ§Ø¦Ùات تستخدÙ
ÙÙØ§Ø¦Ùات Ø¹Ø§Ø¯ÙØ© âpure dictionariesâ ØÙØ« ÙØ§ ØªÙØ¬Ø¯ ÙØ¯ÙÙØ§ Ø£Ù Ù
شاÙ٠إذا ÙØ§Ù
اÙÙ
ستخدÙ
بإدخا٠"__proto__" ÙØ¥Ø³Ù
ÙÙØ®Ø§ØµÙØ©.
Ø¯ÙØ§Ù أخرÙ:
- Object.keys(obj) / Object.values(obj) / Object.entries(obj) â ØªÙÙ٠بإرجاع ÙØ§Ø¦Ù Ø© ٠٠خصائص اÙÙØ§Ø¦Ù اÙÙ Ø¹Ø¯ÙØ¯Ø© (enumerable) Ø³ÙØ§Ø¡Ùا أس٠اء Ø£Ù ÙÙÙ Ø£Ù Ø§ÙØ¥Ø«ÙÙÙ Ù Ø¹ÙØ£.
- Object.getOwnPropertySymbols(obj) â ØªÙÙ٠بإرجاع ÙØ§Ø¦Ù Ø© بخصائص اÙÙØ§Ø¦Ù Ù Ù ÙÙØ¹ Ø§ÙØ±Ù ز (symbolic properties).
- Object.getOwnPropertyNames(obj) â ØªÙÙ٠بإرجاع ÙÙ Ø§Ø§ÙØ®ØµØ§Ø¦Øµ Ù Ù ÙÙØ¹ اÙÙØµ (string properties).
- Reflect.ownKeys(obj) â ØªÙÙ٠بإرجاع ÙØ§Ø¦Ù Ø© بÙÙ Ø§ÙØ®ØµØ§Ø¦Øµ Ø§ÙØªÙ ÙØØªÙÙÙØ§ اÙÙØ§Ø¦Ù.
- obj.hasOwnProperty(key): returns
trueifobjhas its own (not inherited) key namedkey. - obj.hasOwnProperty(key): تÙÙÙ
بإرجاع
trueإذا Ø§ØØªÙ٠اÙÙØ§Ø¦Ù ÙÙÙØ³ ÙÙ ÙØ°Ø¬Ù عÙÙ Ø®Ø§ØµÙØ© تس٠Ùkey.
ÙÙ Ø§ÙØ¯ÙØ§Ù Ø§ÙØªÙ تÙÙÙ
بإرجاع خصائص اÙÙØ§Ø¦Ù (Ù
ث٠Object.keys ÙØºÙØ±ÙØ§) â ØªÙÙÙ
بإرجاع Ø§ÙØ®ØµØ§Ø¦Øµ اÙÙ
ÙØ¬Ùدة Ù٠اÙÙØ§Ø¦Ù ÙÙØ· ÙÙÙØ³Øª اÙÙ
ÙØ¬Ùدة ÙÙ ÙÙ
ÙØ°Ø¬Ù (its prototype). ÙØ¥Ø°Ø§ ÙÙØ§ ÙØ±Ùد إرجاع اÙÙ
ÙØ¬Ùدة Ù٠اÙÙÙ
ÙØ°Ø¬ Ø£ÙØ¶Ùا ÙÙÙ
ÙÙÙØ§ استخداÙ
Ø§ÙØªÙرار for..in.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)