ÙÙØªÙØ ÙÙØ§ اÙÙ
ÙØ¹Ø§Ù
Ù instanceof (Ø£ÙÙ Ø³ÙØ±Ùرة Ù
Ù) ÙØØµ Ù٠اÙÙØ§Ø¦Ù ÙÙØªÙ
٠إÙÙ Ø§ÙØµÙ٠اÙÙÙØ§ÙÙØ ÙÙ
ا ÙØ£Ø®Ø° اÙÙØ±Ø§Ø«Ø© ÙÙ Ø§ÙØØ³Ø¨Ø§Ù Ø¹ÙØ¯ اÙÙØØµ.
Such a check may be necessary in many cases. For example, it can be used for building a polymorphic function, the one that treats arguments differently depending on their type.
٠عا٠٠instanceof
ØµÙØ§ØºØªÙ ÙÙ:
obj instanceof Class;
ÙÙØ¹Ùد اÙÙ
ÙØ¹Ø§Ù
Ù ÙÙÙ
Ø© true ÙÙ ÙØ§Ù اÙÙØ§Ø¦Ù obj ÙÙØªÙ
٠إÙÙ Ø§ÙØµÙÙ Class أ٠أÙ٠صÙÙ ÙØ±Ø«Ù.
٠ثاÙ:
class Rabbit {}
let rabbit = new Rabbit();
// â«ÙÙ ÙÙ ÙØ§Ø¦Ù Ù
Ù Ø§ÙØµÙÙ RabbitØ
alert( rabbit instanceof Rabbit ); // ÙØ¹Ù
Ù٠ا ÙØ¹Ù ٠٠ع Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¨Ø§ÙÙØ©:
// â«Ø¨Ø¯Ù استعÙ
ا٠class
function Rabbit() {}
alert( new Rabbit() instanceof Rabbit ); // ÙØ¹Ù
â¦ÙÙ
ا ÙØ§ÙØ£ØµÙØ§Ù اÙÙ
ضÙ
ÙÙØ© Ù
ث٠اÙÙ
صÙÙÙØ§Øª Array:
let arr = [1, 2, 3];
alert(arr instanceof Array); // ÙØ¹Ù
alert(arr instanceof Object); // ÙØ¹Ù
ÙØ§ØØ¸ ÙÙ٠أÙ٠اÙÙØ§Ø¦Ù arr ÙÙØªÙ
٠إÙ٠صÙ٠اÙÙØ§Ø¦Ùات Object Ø£ÙØ¶ÙØ§Ø Ø¥Ø° ترث اÙÙ
صÙÙÙØ§Øª -عبر prototype- اÙÙØ§Ø¦ÙاتÙ.
عادة٠Ù
ا ÙØªØÙÙ٠اÙÙ
ÙØ¹Ø§Ù
Ù instanceof Ù
Ù Ø³ÙØ³ÙØ© prototype Ø¹ÙØ¯ اÙÙØØµ. ÙÙ
ا ÙÙ
ÙÙÙØ§ ÙØ¶Ø¹ اÙÙ
ÙØ·Ù Ø§ÙØ°Ù ÙØ±Ùد ÙÙÙ٠صÙÙ ÙÙ Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ«Ø§Ø¨Øª Symbol.hasInstance.
تعÙ
Ù Ø®ÙØ§Ø±Ø²Ù
ÙØ© obj instanceof Class Ø¨ÙØ°Ù Ø§ÙØ·Ø±ÙÙØ© ØªÙØ±ÙØ¨ÙØ§:
-
ÙÙ ÙØ¬Ø¯Øª Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ«Ø§Ø¨Øª
Symbol.hasInstanceتستدعÙÙ ÙÙÙØªÙÙ Ø§ÙØ£Ù ر:Class[Symbol.hasInstance](obj)â. ÙÙØ¹Ùد Ø§ÙØªØ§Ø¨Ùع Ø¥Ù ÙØ§trueÙØ¥Ù ÙØ§false. ÙÙØ°Ø§ ÙØ®ØµÙص سÙÙ٠اÙÙ ÙØ¹Ø§Ù Ùinstanceof.٠ثاÙ:
// â«Ø¶Ø¨Ø· instanceOf ÙÙØªØÙÙ Ù Ù Ø§ÙØ§Ùتراض اÙÙØ§Ø¦Ù // â«Ø¨Ø£Ù ÙÙ Ø´ÙØ¡ ÙÙ ÙÙ Ø§ÙØ®Ø§ØµÙØ© canEat ÙÙ ØÙÙØ§Ù class Animal { static [Symbol.hasInstance](obj) { if (obj.canEat) return true; } } let obj = { canEat: true }; alert(obj instanceof Animal); // true: Animal[Symbol.hasInstance](obj) is called -
ÙÙØ³ ÙØ£ØºÙب Ø§ÙØ£ØµÙØ§Ù Ø§ÙØªØ§Ø¨Ùع
Symbol.hasInstance. ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ© تستع٠٠اÙÙ ÙØ·Ù Ø§ÙØ¹Ø§Ø¯Ù: ÙÙØØµobj instanceOf ClassÙÙ ÙØ§Ù ÙØ§Ø¦ÙClass.prototype٠ساÙÙÙØ§ ÙØ£ØØ¯ ÙØ§Ø¦Ùات prototype ÙÙ Ø³ÙØ³ÙØ© ÙØ§Ø¦Ùات prototype ÙÙÙØ§Ø¦Ùobj.ÙØ¨Ø¹Ø¨Ø§Ø±Ø© Ø£Ø®Ø±Ù Ø ÙØ§Ø²Ù بÙÙÙÙ ÙØ§ØØ¯Ùا تÙÙ Ø§ÙØ¢Ø®Ø±:
obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // â«ÙÙ ÙØ§Ùت إجابة Ø£ÙÙØ§ Ù ÙÙØ§ trueØ ÙØªÙØ¹ÙØ¯ true // â«ÙØ¥ÙÙØ§ Ù ØªÙ ÙØµÙت ÙÙØ§ÙØ© Ø§ÙØ³ÙØ³ÙØ© أعادت falseÙ٠اÙÙ Ø«Ø§Ù Ø£Ø¹ÙØ§Ù ÙØ±Ù
rabbit.__proto__ === Rabbit.prototypeØ Ø¨Ø°ÙÙ ØªÙØ¹Ø·ÙÙØ§ Ø§ÙØ¬Ùاب ٠باشرةÙ.Ø£Ù ÙØ§ ÙÙ ÙÙÙØ§ ÙÙ ØØ§ÙØ© ÙØ±Ø§Ø«Ø©Ø ÙØ³ØªØªÙÙÙ٠ع٠ÙÙØ© اÙÙ Ø·Ø§Ø¨ÙØ© Ø¹ÙØ¯ Ø§ÙØ®Ø·ÙØ© Ø§ÙØ«Ø§ÙÙØ©:
class Animal {} class Rabbit extends Animal {} let rabbit = new Rabbit(); alert(rabbit instanceof Animal); // ÙØ¹Ù // rabbit.__proto__ === Rabbit.prototype // rabbit.__proto__.__proto__ === Animal.prototype (تطابÙ!)
Ø¥ÙÙÙ ØµÙØ±Ø© ØªÙØ¶ÙØ Ø·Ø±ÙÙØ© Ù
ÙØ§Ø²ÙØ© rabbit instanceof Animal Ù
ع Animal.prototype:
ÙÙ
ا ÙÙÙØ§Ù Ø£ÙØ¶Ùا Ø§ÙØªØ§Ø¨Ùع objA.isPrototypeOf(objB)âØ ÙÙÙ ÙÙØ¹Ùد true ÙÙ ÙØ§Ù اÙÙØ§Ø¦Ù objA ÙÙ Ù
ÙØ§Ù Ø¯Ø§Ø®Ù Ø³ÙØ³ÙØ© prototype ÙÙÙØ§Ø¦Ù objB. ÙØ¹Ù٠أÙÙÙØ§ ÙØ³ØªØ·Ùع ÙØªØ§Ø¨Ø© اÙÙØØµ ÙØ°Ø§ obj instanceof Class ÙÙØ°Ø§: Class.prototype.isPrototypeOf(obj)â.
Ø§ÙØ£Ù
ر Ù
ضØÙ إذ Ø£Ù٠باÙÙ Ø§ÙØµÙÙ Class ÙÙØ³Ù ÙÙØ³ ÙØ¯Ù٠أÙÙ ÙÙÙ
Ø© Ø¹Ù ÙØ°Ø§ اÙÙØØµ! اÙÙ
ÙÙ
ÙÙ Ø³ÙØ³ÙØ© prototype ÙÙØ§Ø¦Ù Class.prototype ÙÙØ·.
ÙÙ
ÙÙ Ø£Ù ÙØ¤Ø¯ÙÙ ÙØ°Ø§ Ø¥ÙÙ Ø¹ÙØ§Ùب Ù
Ø«ÙØ±Ø© Ù
ت٠تغÙÙØ±Øª Ø®Ø§ØµÙØ© prototype ÙÙÙØ§Ø¦Ù بعد Ø¥ÙØ´Ø§Ø¦Ù. Ø·Ø§ÙØ¹:
function Rabbit() {}
let rabbit = new Rabbit();
// غÙÙØ±Ùا ÙØ§Ø¦Ù prototype
Rabbit.prototype = {};
// ...ÙÙ
ÙØ¹Ø¯ Ø£Ø±ÙØ¨Ùا بعد Ø§ÙØ¢Ù!
alert( rabbit instanceof Rabbit ); // ÙØ§
Ø§ÙØªØ§Ø¨Ø¹ Object.prototype.toString ÙÙØ£ÙÙØ§Ø¹
ÙØ¹ÙÙ
بأÙ٠اÙÙØ§Ø¦Ùات Ø§ÙØ¹Ø§Ø¯ÙØ© ØÙ٠تتØÙÙ٠إÙÙ Ø³ÙØ§Ø³Ù ÙØµÙØ© ØªØµÙØ± [object Object]:
let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // ÙÙ
ا Ø£Ø¹ÙØ§Ù
ÙØ¹ØªÙ
د ÙØ°Ø§ عÙ٠طرÙÙØ© تÙÙÙØ±ÙÙ
ÙØªÙÙÙØ° Ø§ÙØªØ§Ø¨Ùع toString. ÙÙÙÙ ÙÙØ§Ù Ù
ÙØ²Ø© Ù
Ø®ÙÙÙØ© ØªØ¬Ø¹Ù ÙØ°Ø§ Ø§ÙØªØ§Ø¨Ùع Ø£ÙØ«Ø± ÙØ§Ø¦Ø¯Ø© Ø¨ÙØ«Ùر Ù
Ù
ÙØ§ Ù٠عÙÙÙØ Ø£Ù ÙØ³ØªØ¹Ù
Ù٠عÙ٠أÙÙÙ Ù
ÙØ¹Ø§Ù
Ù typeof Ù
ÙØ³Ùع اÙÙ
Ø²Ø§ÙØ§Ø أ٠بدÙÙÙØ§ Ø¹Ù Ø§ÙØªØ§Ø¨Ùع toString.
ØªØ¨Ø¯Ù ØºØ±ÙØ¨Ø©Ø Ø£ÙÙØ³ ÙØ°ÙÙØ ÙÙÙØ²Ù Ø§ÙØºÙ ÙØ¶.
ØØ³Ø¨ اÙÙ
ÙØ§ØµÙØ©Ø ÙÙÙ
ÙÙÙØ§ استخراج Ø§ÙØªØ§Ø¨Ùع toString اÙÙ
ضÙ
ÙÙ Ù
٠اÙÙØ§Ø¦Ù ÙØªÙÙÙØ°Ù ÙÙ Ø³ÙØ§Ù Ø£ÙÙ ÙÙÙ
Ø© Ø£Ø®Ø±Ù ÙØ±ÙØ¯Ø ÙØ³ÙÙÙÙ ÙØ§ØªØ¬Ù ØØ³Ø¨ تÙ٠اÙÙÙÙ
Ø©.
- ÙÙ ÙØ§Ù Ø¹Ø¯Ø¯ÙØ§Ø ÙØ³ÙÙÙÙ
[object Number] - ÙÙ ÙØ§Ù ÙÙÙ
Ø© Ù
ÙØ·ÙÙØ©Ø ÙØ³ÙÙÙÙ
[object Boolean] - ÙÙ ÙØ§Ù
null: â[object Null] - ÙÙ ÙØ§Ù
undefined: â[object Undefined] - ÙÙ ÙØ§Ùت Ù
صÙÙÙØ©:
[object Array] - â¦Ø¥Ù٠آخر٠(ÙÙÙ ÙÙÙØ§ ØªØ®ØµÙØµ ذÙÙ).
ÙÙÙØ§ ÙÙØ¶ÙØ:
// ÙÙØ³Ø® Ø§ÙØªØ§Ø¨Ùع⫠toString Ø¥ÙÙ Ù
ØªØºÙØ± ÙÙØ³Ù٠عÙ
ÙÙØ§
let objectToString = Object.prototype.toString;
// Ù
ا ÙØ°Ø§ اÙÙÙØ¹Ø
let arr = [];
alert(objectToString.call(arr)); // [object Ù
صÙÙÙØ©]
استعÙ
ÙÙØ§ ÙÙØ§ callâ ÙØªÙÙÙØ° Ø§ÙØ¯Ø§ÙØ© objectToString Ø¨Ø³ÙØ§Ù this=arr.
ØªÙØØµ Ø®ÙØ§Ø±Ø²Ù
ÙØ© toString داخÙÙÙØ§ ÙÙÙ
Ø© this ÙØªÙØ¹ÙØ¯ اÙÙØ§ØªØ¬ اÙÙ
ÙØ§ÙÙ ÙÙØ§. Ø¥ÙÙ٠أÙ
Ø«ÙØ© أخرÙ:
let s = Object.prototype.toString;
alert(s.call(123)); // [object Number]
alert(s.call(null)); // [object Null]
alert(s.call(alert)); // [object Function]
Ø®Ø§ØµÙØ© Symbol.toStringTag
ÙÙ
ÙÙÙØ§ ØªØ®ØµÙØµ سÙÙÙ Ø§ÙØªØ§Ø¨Ùع toString ÙÙÙØ§Ø¦Ùات باستعÙ
Ø§Ù Ø®Ø§ØµÙØ© اÙÙØ§Ø¦Ùات Symbol.toStringTag اÙÙØ±Ùدة.
٠ثاÙ:
let user = {
[Symbol.toStringTag]: 'User',
};
alert({}.toString.call(user)); // [object User]
ÙØ£ØºÙب اÙÙØ§Ø¦Ùات Ø§ÙØ®Ø§ØµÙØ© Ø¨Ø§ÙØ¨Ùئات Ø®Ø§ØµÙØ© Ù Ø«Ù ÙØ°Ù. Ø¥ÙÙ٠بعض Ø§ÙØ£Ù Ø«ÙØ© ٠٠اÙ٠تصÙÙØØ§Øª Ù Ø«ÙÙØ§:
// toStringTag for the environment-specific object and class:
alert(window[Symbol.toStringTag]); // Window
alert(XMLHttpRequest.prototype[Symbol.toStringTag]); // XMLHttpRequest
alert({}.toString.call(window)); // [object Window]
alert({}.toString.call(new XMLHttpRequest())); // [object XMLHttpRequest]
ÙÙ
ا ÙØ±Ù ÙØ§ÙÙØ§ØªØ¬ Ù٠تÙ
اÙ
ÙØ§ Ù
ا ÙÙÙÙÙ Symbol.toStringTag (ÙÙ ÙÙØ¬Ø¯) Ø¨ØºÙØ§Ù [object ...â].
Ù٠اÙÙÙØ§ÙØ© ÙØ¬Ø¯ Ø£Ù ÙØ¯ÙÙØ§ âÙÙØ¹ ٠٠اÙÙ ÙØ´Ø·Ø§Øªâ ÙØ§ تع٠٠ÙÙØ· عÙÙ Ø§ÙØ£ÙÙØ§Ø¹ Ø§ÙØ£ÙÙÙØ© ÙÙØ¨ÙØ§ÙØ§Øª Ø¨Ù ÙØØªÙ Ø§ÙÙØ§Ø¦Ùات اÙÙ Ø¶Ù ÙØ© Ù٠اÙÙØºØ© ÙÙÙ ÙÙÙØ§ ØªØ®ØµÙØµÙا Ø£ÙØ¶Ùا.
ÙÙ
ÙÙÙØ§ استخداÙ
â{}.toString.call بدÙÙØ§ Ù
Ù instanceof ÙÙÙØ§Ø¦Ùات اÙÙ
ضÙ
ÙØ© Ù٠اÙÙØºØ© Ø¹ÙØ¯Ù
ا ÙØ±Ùد Ø§ÙØØµÙ٠عÙÙ ÙÙØ¹ Ø§ÙØ¨ÙØ§ÙØ§Øª ÙØ³ÙØ³ÙØ© بدÙÙØ§ Ù
Ù Ø§ÙØªØÙÙ Ù
ÙÙØ§.
اÙÙ ÙØ®Øµ
ÙÙÙØ®Ùص ٠ا ÙØ¹Ø±Ù Ø¹Ù Ø§ÙØªÙØ§Ø¨ÙØ¹ Ø§ÙØªÙ ØªÙØØµ Ø§ÙØ£ÙÙØ§Ø¹:
| ÙØ¹Ù ٠عÙÙ | ÙÙØ¹Ùد | |
|---|---|---|
typeof |
Ø§ÙØ£ÙÙØ§Ø¹ Ø§ÙØ£ÙÙÙØ© | Ø³ÙØ³ÙØ© ÙØµÙØ© |
{}.toString |
Ø§ÙØ£ÙÙØ§Ø¹ Ø§ÙØ£ÙÙÙØ© ÙØ§ÙÙØ§Ø¦Ùات اÙÙ
ضÙ
ÙÙØ© ÙØ§ÙÙØ§Ø¦Ùات Ø§ÙØªÙ ÙÙØ§ Symbol.toStringTag |
Ø³ÙØ³ÙØ© ÙØµÙØ© |
instanceof |
اÙÙØ§Ø¦Ùات | true/false |
ÙÙ
ا ÙØ±Ù ÙØ¹Ø¨Ø§Ø±Ø© â{}.toString Ù٠تÙÙÙÙØ§ typeof ÙÙÙÙ âÙ
ØªÙØ¯ÙÙ
Ø© Ø£ÙØ«Ø±â.
Ø¨Ù Ø¥Ù Ø§ÙØªØ§Ø¨Ø¹ instanceof ÙØ¤Ø¯Ù Ø¯ÙØ± Ù
Ù
ÙÙØ² Ø¹ÙØ¯Ù
ا ÙØªØ¹Ø§Ù
Ù Ù
ع ØªØ³ÙØ³Ù ÙØ±Ù
Ù ÙÙØ£ØµÙا٠ÙÙØ±Ùد Ø§ÙØªØÙÙ Ù
٠صÙÙÙ Ù
ا Ù
ع Ù
راعاة اÙÙØ±Ø§Ø«Ø©.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)