عÙ
Ùگر instanceOf ب٠Ù
ا اÛ٠اÙ
کا٠را Ù
ÛâØ¯ÙØ¯ Ú©Ù Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ
ÛÚ© Ø´ÛØ¡ Ø¨Ù Ú©ÙØ§Ø³Û Ù
شخص تعÙ٠دارد ÛØ§ Ø®ÛØ±. اÛ٠عÙ
Ùگر Ø§Ø±Ø«âØ¨Ø±Û Ø±Ø§ ÙÙ
Ù
ØØ³Ùب Ù
ÛâÚ©ÙØ¯.
ÚÙÛ٠بررسÛâØ§Û Ù Ù Ú©Ù Ø§Ø³Øª در Ù ÙØ§Ø±Ø¯ Ø¨Ø³ÛØ§Ø±Û Ø¶Ø±ÙØ±Û باشد. Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ Ù ÛâØªÙØ§ÙÛÙ Ø¨Ø±Ø§Û Ø³Ø§Ø®Øª ÛÚ© تابع ÚÙØ¯Ø±Ûخت (polymorphic) از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ Ø ØªØ§Ø¨Ø¹Û Ú©Ù Ø¨Ø± اساس ÙÙØ¹ آرگÙ٠اÙâÙØ§ با Ø¢ÙâÙØ§ Ø¨Ù ØµÙØ±Øª Ù ØªÙØ§Ùت Ø±ÙØªØ§Ø± Ù ÛâÚ©ÙØ¯.
ع٠Ùگر instanceof
سÛÙØªÚ©Ø³ اÛÙÚ¯ÙÙ٠است:
obj instanceof Class
اگر obj ب٠Class ÛØ§ Ú©ÙØ§Ø³Û ک٠از Ø¢Ù Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯ تعÙÙ Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø§Û٠عÙ
Ùگر Ù
ÙØ¯Ø§Ø± true را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
class Rabbit {}
let rabbit = new Rabbit();
// Ø§Ø³ØªØ Rabbit Ø¢ÛØ§ Ø´ÛØ¡Ø§Û از Ú©ÙØ§Ø³
alert( rabbit instanceof Rabbit ); // true
با تابعâÙØ§Û Ø³Ø§Ø²ÙØ¯Ù Ù٠کار Ù ÛâÚ©ÙØ¯:
// Ø¨Ù Ø¬Ø§Û Ú©ÙØ§Ø³
function Rabbit() {}
alert( new Rabbit() instanceof Rabbit ); // true
â¦Ù با Ú©ÙØ§Ø³âÙØ§Û درÙÙâØ³Ø§Ø®Øª Ù
اÙÙØ¯ Array:
let arr = [1, 2, 3];
alert( arr instanceof Array ); // true
alert( arr instanceof Object ); // true
ÙØ·Ùا در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ Ú©Ù arr ÙÙ
Ø¨Ù Ú©ÙØ§Ø³ Object تعÙ٠دارد. ب٠اÛ٠دÙÛÙ Ú©Ù Array Ø¨Ù ØµÙØ±Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û Ø§Ø² Object Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯.
Ù
عÙ
ÙÙØ§Ø instanceof Ø²ÙØ¬ÛØ±Ù Ù¾Ø±ÙØªÙتاÛÙ¾ را Ø¨Ø±Ø±Ø³Û Ù
ÛâÚ©ÙØ¯. Ù
ا ÙÙ
Ù
ÛâØªÙØ§ÙÛÙ
ÛÚ© Ù
ÙØ·Ù Ø³ÙØ§Ø±Ø´Û در Ù
تد Ø§ÛØ³ØªØ§Û Symbol.hasInstance Ø§ÛØ¬Ø§Ø¯ Ú©ÙÛÙ
.
اÙÚ¯ÙØ±ÛتÙ
obj instanceof Class ØªÙØ±Ûبا اÛÙÚ¯ÙÙ٠عÙ
Ù Ù
ÛâÚ©ÙØ¯:
-
اگر ٠تد Ø§ÛØ³ØªØ§Û
Symbol.hasInstanceÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø³Ù¾Ø³ آ٠را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ù:Class[Symbol.hasInstance](obj). اÛ٠٠تد Ø¨Ø§ÛØ¯trueÛØ§falseرا Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯ ٠کار ت٠ا٠است. ٠ا اÛÙÚ¯ÙÙÙ Ø±ÙØªØ§Ø±instanceofرا شخصÛâØ³Ø§Ø²Û Ù ÛâÚ©ÙÛÙ .Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
// تا instanceof راÙâØ§ÙØ¯Ø§Ø²Û Ø¨Ø±Ø±Ø³Û Ú©Ø±Ø¯Ù // ÙØ±Ø¶ Ú©ÙØ¯ (animal) را ÛÚ© جاÙÙØ± 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) -
اکثر Ú©ÙØ§Ø³âÙØ§
Symbol.instanceofرا ÙØ¯Ø§Ø±Ùد. در اÛÙ ØµÙØ±ØªØ Ù ÙØ·Ù Ø§Ø³ØªØ§ÙØ¯Ø§Ø±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯:obj instanceOf ClassØ¨Ø±Ø±Ø³Û Ù ÛâÚ©ÙØ¯ Ú©Ù Ø¢ÛØ§Class.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); // true // rabbit.__proto__ === Animal.prototype (٠ساÙÛ ÙÛØ³Øª) // rabbit.__proto__.__proto__ === Animal.prototype (!٠ساÙÛ Ø§Ø³Øª)
اÛÙ ÙÙ
تصÙÛØ± ÚÛØ²Û Ú©Ù rabbit instanceof Animal با Animal.prototype Ù
ÙØ§Ûس٠Ù
ÛâÚ©ÙØ¯:
Ø±Ø§Ø³ØªÛØ ÙÙ
ÚÙÛÙ Ù
ØªØ¯Û Ø¨Ù ÙØ§Ù
objA.isPrototypeOf(objB) ÙØ¬Ùد دارد ک٠اگر objA جاÛÛ Ø¯Ø± Ø²ÙØ¬ÛØ±Ù Ù¾Ø±ÙØªÙتاÛÙ¾ objB ÙØ¬Ùد داشت٠باشد true را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯. پس Ø¨Ø±Ø±Ø³Û obj instanceof Class Ù
ÛâØªÙØ§Ùد Ø¨Ù ØµÙØ±Øª Class.prototype.isPrototypeOf(obj) بازÙÙÛØ³Û Ø´ÙØ¯.
Ø¬Ø§ÙØ¨ است Ú©Ù Ø³Ø§Ø²ÙØ¯Ù Class Ø®ÙØ¯Ø´ در Ø¨Ø±Ø±Ø³Û Ø´Ø±Ú©Øª ÙÙ
ÛâÚ©ÙØ¯! ÙÙØ· Ø²ÙØ¬ÛØ±Ù Ù¾Ø±ÙØªÙتاÛÙ¾âÙØ§ Ù Class.prototype Ù
ÙÙ
ÙØ³ØªÙد.
زÙ
اÙÛ Ú©Ù ÙÛÚÚ¯Û prototype بعد از اÛÙÚ©Ù Ø´ÛØ¡ ساخت٠شد تغÛÛØ± Ú©ÙØ¯Ø اÛÙ Ù
ÙØ¶Ùع Ù
ÛâØªÙØ§Ùد باعث Ø§ÛØ¬Ø§Ø¯ Ù¾ÛØ§Ù
Ø¯ÙØ§Û Ø¬Ø§ÙØ¨Û Ø´ÙØ¯.
٠ث٠اÛÙØ¬Ø§:
function Rabbit() {}
let rabbit = new Rabbit();
// Ù¾Ø±ÙØªÙتاÛÙ¾ را تغÛÛØ± دادÛÙ
Rabbit.prototype = {};
// !ÙÛØ³Øª (rabbit) دÛگر ÛÚ© Ø®Ø±Ú¯ÙØ´
alert( rabbit instanceof Rabbit ); // false
راÙÙ٠اÛÛ: ٠تد Object.prototype.toString Ø¨Ø±Ø§Û ÙÙØ¹
Ù
ا از ÙØ¨Ù Ù
ÛâØ¯Ø§ÙÛÙ
Ú©Ù Ø´ÛØ¡ÙØ§Û Ø³Ø§Ø¯Ù Ø¨Ù ØµÙØ±Øª [object Object] ب٠رشت٠تبدÛÙ Ù
ÛâØ´ÙÙØ¯:
let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // ÛکساÙ
اÛÙ Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û toString Ø¢ÙâÙØ§ است. اÙ
ا در ÙØ§Ùع ÛÚ© ÙÛÚÚ¯Û Ù¾ÙÙØ§ÙÛ ÙØ¬Ùد دارد Ú©Ù toString را از Ø¢Ù Ø®ÛÙÛ ÙØ¯Ø±ØªÙ
ÙØ¯ØªØ± Ù
ÛâÚ©ÙØ¯. Ù
ÛâØªÙØ§ÙÛÙ
از اÛÙ Ù
تد ب٠عÙÙØ§Ù ÛÚ© typeof Ù¾ÛØ´Ø±ÙتÙâØªØ± Ù ÛÚ© جاÛگزÛÙ Ø¨Ø±Ø§Û instanceof Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
.
Ø¹Ø¬ÛØ¨ Ø¨Ù ÙØ¸Ø± Ù ÛâØ±Ø³Ø¯Ø ÙØ§Ùعا ÙÙ ÙØ³Øª. Ø¨ÛØ§ÛÛØ¯ آ٠را سادÙâØªØ± Ø¨ÛØ§Ù Ú©ÙÛÙ .
با ØªÙØ¬Ù ب٠Ù
شخصات Ø²Ø¨Ø§ÙØ toString درÙÙâØ³Ø§Ø®Øª Ù
ÛâØªÙØ§Ùد از Ø´ÛØ¡ استخراج Ø´ÙØ¯ ٠در زÙ
ÛÙÙ (context) ÙØ± Ù
ÙØ¯Ø§Ø± دÛÚ¯Ø±Û Ø§Ø¬Ø±Ø§ Ø´ÙØ¯. Ù ÙØªÛجÙâØ§Ø´ ب٠آ٠Ù
ÙØ¯Ø§Ø± Ø¨Ø³ØªÚ¯Û Ø¯Ø§Ø±Ø¯.
- Ø¨Ø±Ø§Û ÛÚ© عددØ
[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 Array]
اÛÙØ¬Ø§ Ù
ا از call ÙÙ
Ø§ÙØ·Ùر ک٠در ÙØµÙ Ø¯Ú©ÙØ±Ø§ØªÙØ±ÙØ§ Ù Ø§Ø±Ø³Ø§Ù Ú©Ø±Ø¯ÙØ Ù
ØªØ¯ÙØ§Û call/apply ØªÙØ¶ÛØ Ø¯Ø§Ø¯Ù Ø´Ø¯ Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ 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
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 ...] است.
در ÙÙØ§Ûت ٠ا «اÙÙØ§Ø¹Û از Ø§Ø³ØªØ±ÙØ¦ÛØ¯ÙØ§Â» را دارÛÙ Ú©Ù Ù٠تÙÙØ§ Ø¨Ø±Ø§Û Ø§ÙÙØ§Ø¹ داد٠اصÙÛ Ú©Ø§Ø± Ù ÛâÚ©ÙØ¯Ø بÙÚ©Ù Ø¨Ø±Ø§Û Ø´ÛØ¡ÙØ§Û Ø¯Ø±ÙÙâØ³Ø§Ø®Øª Ù٠کار Ù ÛâÚ©ÙØ¯ Ù ØØªÛ Ù ÛâØªÙØ§Ùد شخصÛâØ³Ø§Ø²Û Ø´ÙØ¯.
زÙ
اÙÛ Ú©Ù Ù
ÛâØ®ÙØ§ÙÛÙ
ÙÙØ¹ داد٠را ب٠عÙÙØ§Ù ÛÚ© Ø±Ø´ØªÙ Ø¯Ø±ÛØ§Ùت Ú©ÙÛÙ
تا اÛÙÚ©Ù ÙÙØ· Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ
Ø Ù
ÛâØªÙØ§ÙÛÙ
Ø¨Ù Ø¬Ø§Û instanceof از {}.toString.call Ø¨Ø±Ø§Û Ø´ÛØ¡ÙØ§Û Ø¯Ø±ÙÙâØ³Ø§Ø®Øª Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
.
Ø®ÙØ§ØµÙ
Ø¨ÛØ§ÛÛØ¯ Ù ØªØ¯ÙØ§Û Ø¨Ø±Ø±Ø³Û ÙÙØ¹ داد٠ک٠٠ÛâØ´ÙØ§Ø³Û٠را Ø®ÙØ§ØµÙ Ú©ÙÛÙ :
| کار Ù ÛâÚ©ÙØ¯ Ø¨Ø±Ø§Û | بر٠ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ | |
|---|---|---|
typeof |
Ù ÙØ¯Ø§Ø±ÙØ§Û Ø§ØµÙÛ | رشت٠|
{}.toString |
Ù
ÙØ¯Ø§Ø±ÙØ§Û Ø§ØµÙÛØ Ø´ÛØ¡ÙØ§Û Ø¯Ø±ÙÙâØ³Ø§Ø®ØªØ Ø´ÛØ¡Ùا شاÙ
Ù Symbol.toStringTag |
رشت٠|
instanceof |
Ø´ÛØ¡Ùا | true/false |
ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ù
ÛâØ¨ÛÙÛØ¯Ø {}.toString از ÙØØ§Ø¸ ÙÙÛ ÛÚ© typeof Â«Ù¾ÛØ´Ø±ÙتÙâØªØ±Â» است.
زÙ
اÙÛ Ú©Ù Ø¨Ø§ Ø³ÙØ³ÙÙâØ§Û Ø§Ø² Ú©ÙØ§Ø³âÙØ§ کار Ù
ÛâÚ©ÙÛÙ
Ù Ù
ÛâØ®ÙØ§ÙÛÙ
Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ
Ú©Ù Ú©ÙØ§Ø³ در Ø§Ø±Ø«âØ¨Ø±Û ÙØ¬Ùد دارد ÛØ§ ÙÙØ عÙ
Ùگر instanceof ÙØ§Ùعا Ù
ÛâØ¯Ø±Ø®Ø´Ø¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)