٠ا Ù ÛâØªÙØ§ÙÛÙ ÛÚ© ٠تد را Ø¨Ù ØªÙ Ø§Ù Ú©ÙØ§Ø³ اختصاص دÙÛÙ . ÚÙÛÙ Ù ØªØ¯ÙØ§ÛÛ Ø§ÛØ³ØªØ§ (static) ÙØ§Ù ÛØ¯Ù Ù ÛâØ´ÙÙØ¯.
در ÛÚ© Ú©ÙØ§Ø³Ø Ø¢ÙâÙØ§ با Ú©ÙÙ
Ù Ú©ÙÛØ¯Û static Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙÙØ¯Ø Ù
ث٠اÛÙ:
class User {
static staticMethod() {
alert(this === User);
}
}
User.staticMethod(); // true
اÛ٠کار دÙÛÙØ§ ٠اÙÙØ¯ اÛ٠است Ú©Ù Ø¨Ù Ø·ÙØ± ٠ستÙÛÙ ÛÚ© ÙÛÚÚ¯Û Ø±Ø§ Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ú©ÙÛÙ :
class User { }
User.staticMethod = function() {
alert(this === User);
};
User.staticMethod(); // true
Ù
ÙØ¯Ø§Ø± this درÙÙ ÙØ±Ø§Ø®ÙاÙÛ User.staticMethod() برابر با Ú©ÙØ§Ø³ Ø³Ø§Ø²ÙØ¯Ù ÛØ¹ÙÛ Ø®ÙØ¯ User است (ÙØ§ÙÙÙ Â«Ø´ÛØ¡ ÙØ¨Ù از ÙÙØ·Ù»).
٠ع٠ÙÙØ§Ø Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ Ø¨Ø±Ø§Û Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û ØªØ§Ø¨Ø¹âÙØ§ÛÛ Ú©Ù Ø¨Ù Ú©Ù Ú©ÙØ§Ø³ تعÙÙ Ø¯Ø§Ø±ÙØ¯ Ù ÙÙ Ø¨Ù ÙØ± Ø´ÛØ¡ Ø®Ø§ØµÛ Ø§Ø² Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
ا Ø´ÛØ¡ÙØ§Û Ú©ÙØ§Ø³ Article (ب٠Ù
عÙÛ Ù
ÙØ§ÙÙ) را دارÛÙ
Ù Ø¨Ù ØªØ§Ø¨Ø¹Û Ø¨Ø±Ø§Û Ù
ÙØ§Ûس٠آÙâÙØ§ ÙÛØ§Ø² دارÛÙ
.
ÛÚ© راÙâØÙ Ø·Ø¨ÛØ¹Û اضاÙ٠کرد٠Ù
تد Ø§ÛØ³ØªØ§Û Article.compare Ø§Ø³ØªØ Ù
Ø«ÙØ§ اÛÙÚ¯ÙÙÙ:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static compare(articleA, articleB) {
return articleA.date - articleB.date;
}
}
// کاراÛÛ
let articles = [
new Article("HTML", new Date(2019, 1, 1)),
new Article("CSS", new Date(2019, 0, 1)),
new Article("JavaScript", new Date(2019, 11, 1))
];
articles.sort(Article.compare);
alert( articles[0].title ); // CSS
اÛÙØ¬Ø§ Article.compare در Â«Ø¨Ø§ÙØ§Û» Ù
ÙØ§ÙÙâÙØ§ (articles) ÙØ±Ø§Ø± Ø¯Ø§Ø±Ø¯Ø Ø¨Ù Ø¹ÙÙØ§Ù Ø±ÙØ´Û Ø¨Ø±Ø§Û Ù
ÙØ§Ûس٠آÙâÙØ§. اÛÙ Ù
ØªØ¯Û Ø¨Ø±Ø§Û ÛÚ© Ù
ÙØ§ÙÙ(article) ÙÛØ³ØªØ بÙÚ©Ù Ø¨Ø±Ø§Û Ú©Ù Ú©ÙØ§Ø³ است.
٠ثا٠دÛگر Ù ØªØ¯Û Ø¨Ù ÙØ§Ù âfactoryâ (ب٠٠عÙÛ ØªÙÙÛØ¯Ú©ÙÙØ¯Ù) است.
ÙØ±Ø¶ Ú©ÙÛØ¯Ø ٠ا ب٠ÚÙØ¯ Ø±Ø§Ù Ø¨Ø±Ø§Û Ø§ÛØ¬Ø§Ø¯ ÛÚ© Ù ÙØ§ÙÙ ÙÛØ§Ø² دارÛÙ :
- ساخت٠از طرÛ٠پاراÙ
ØªØ±ÙØ§ (
titleØdateÙ ØºÛØ±Ù). - ساخت٠ÛÚ© Ù ÙØ§Ù٠خاÙÛ Ø¨Ø§ ØªØ§Ø±ÛØ® Ø§Ù Ø±ÙØ².
- â¦Ûا Ø¨Ù Ø±ÙØ´Û دÛگر.
اÙÙÛ٠را٠٠ÛâØªÙØ§Ùد با Ø§Ø³ØªÙØ§Ø¯Ù از تابع Ø³Ø§Ø²ÙØ¯Ù Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ø´ÙØ¯. Ù Ø¨Ø±Ø§Û Ø±Ø§Ù Ø¯ÙÙ Ù ÛâØªÙØ§ÙÛÙ ÛÚ© ٠تد Ø§ÛØ³ØªØ§ Ø¨Ø±Ø§Û Ú©ÙØ§Ø³ بسازÛÙ .
Ù
اÙÙØ¯ Article.createTodays() در اÛÙØ¬Ø§:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static createTodays() {
// this = Article ØØ¨Ù ÛØ§Ø¯ Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯
return new this("Ø®ÙØ§ØµÙâÛ Ø§Ù
Ø±ÙØ²", new Date());
}
}
let article = Article.createTodays();
alert( article.title ); // Ø®ÙØ§ØµÙâÛ Ø§Ù
Ø±ÙØ²
ØØ§Ùا ÙØ± بار Ú©Ù ÙÛØ§Ø² داشت٠باشÛÙ
ÛÚ© Ø®ÙØ§ØµÙ از اÙ
Ø±ÙØ² بسازÛÙ
Ø Ù
ÛâØªÙØ§ÙÛÙ
Article.createTodays() را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ
. Ûکبار دÛگر ÙÙ
Ù
ÛâÚ¯ÙÛÛÙ
Ø Ø§ÛÙ Ù
ØªØ¯Û Ø§Ø² Ù
ÙØ§ÙÙ (article) ÙÛØ³Øª بÙÚ©Ù Ù
ØªØ¯Û Ø§Ø² Ú©Ù Ú©ÙØ§Ø³ است.
Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ ÙÙ ÚÙÛ٠در Ú©ÙØ§Ø³âÙØ§Û Ù Ø±Ø¨ÙØ· ب٠پاÛگا٠داد٠(database) Ø¨Ø±Ø§Û Ø¬Ø³ØªâÙØ¬Ù/Ø°Ø®ÛØ±Ù/ØØ°Ù ÙØ±ÙدÛâÙØ§ از پاÛگا٠داد٠ÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙÙØ¯Ø Ù Ø«ÙØ§ اÛÙÚ¯ÙÙÙ:
// Ú©ÙØ§Ø³Û خاص Ø¨Ø±Ø§Û Ù
Ø¯ÛØ±Ûت Ù
ÙØ§ÙÙâÙØ§ است Article با ÙØ±Ø¶ اÛÙÚ©Ù
// :id Ù
تد Ø§ÛØ³ØªØ§ Ø¨Ø±Ø§Û ØØ°Ù Ù
ÙØ§ÙÙâÙØ§ ØªÙØ³Ø·
Article.remove({id: 12345});
Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ بر رÙÛ Ú©ÙØ§Ø³âÙØ§Û ÙØ§Ø¨Ù ÙØ±Ø§Ø®ÙاÙÛ ÙØ³ØªÙد Ù٠بر رÙÛ Ø´ÛØ¡Ùا.
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ÚÙÛÙ Ú©Ø¯Û Ú©Ø§Ø± ÙØ®ÙØ§ÙØ¯ کرد:
// ...
article.createTodays(); /// Error: article.createTodays is not a function
ÙÛÚÚ¯ÛâÙØ§Û Ø§ÛØ³ØªØ§
Ù
ÛâØªÙØ§ÙÛÙ
ÙÛÚÚ¯ÛâÙØ§Û Ø§ÛØ³ØªØ§ ÙÙ
داشت٠باشÛÙ
Ø Ø¢ÙâÙØ§ Ù
اÙÙØ¯ ÙÛÚÚ¯ÛâÙØ§Û Ù
عÙ
ÙÙÛ Ú©ÙØ§Ø³ Ø¨ÙØ¸Ø± Ù
ÛâØ±Ø³ÙØ¯ اÙ
ا ÙØ¨Ù از Ø¢ÙâÙØ§ static ÙØ¬Ùد دارد:
class Article {
static publisher = "Ilya Kantor";
}
alert( Article.publisher ); // Ilya Kantor
درست Ù
اÙÙØ¯ Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ù
ستÙÛÙ
ب٠Article است:
Article.publisher = "Ilya Kantor";
Ø§Ø±Ø«âØ¨Ø±Û ÙÛÚÚ¯ÛâÙØ§ Ù Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§
ÙÛÚÚ¯ÛâÙØ§ Ù Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ ب٠ارث برد٠٠ÛâØ´ÙÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ در کد پاÛÛÙ Animal.compare Ù Animal.planet ب٠ارث برد٠Ù
ÛâØ´ÙÙØ¯ Ù Ø¨Ù ØµÙØ±Øª Rabbit.compare Ù Rabbit.planet ÙØ§Ø¨Ù دسترس ÙØ³ØªÙد:
class Animal {
static planet = "زÙ
ÛÙ";
constructor(name, speed) {
this.speed = speed;
this.name = name;
}
run(speed = 0) {
this.speed += speed;
alert(`${this.name} با سرعت ${this.speed} Ù
ÛâØ¯ÙØ¯.`);
}
static compare(animalA, animalB) {
return animalA.speed - animalB.speed;
}
}
// Animal Ø§Ø±Ø«âØ¨Ø±Û Ø§Ø²
class Rabbit extends Animal {
hide() {
alert(`${this.name} ÙØ§ÛÙ
Ù
ÛâØ´ÙØ¯!`);
}
}
let rabbits = [
new Rabbit("Ø®Ø±Ú¯ÙØ´ سÙÛØ¯", 10),
new Rabbit("Ø®Ø±Ú¯ÙØ´ Ù
Ø´Ú©Û", 5)
];
rabbits.sort(Rabbit.compare);
rabbits[0].run(); // Ø®Ø±Ú¯ÙØ´ Ù
Ø´Ú©Û Ø¨Ø§ سرعت 5 Ù
ÛâØ¯ÙØ¯
alert(Rabbit.planet); // زÙ
ÛÙ
ØØ§Ùا زÙ
اÙÛ Ú©Ù Rabbit.compare را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙÛÙ
Ø Animal.compare ک٠ب٠ارث Ø¨Ø±Ø¯Ù Ø´Ø¯Ù ÙØ±Ø§Ø®ÙاÙÛ Ø®ÙØ§Ùد شد.
اÛÙ ÚÚ¯ÙÙ٠کار Ù
ÛâÚ©ÙØ¯Ø Ø¯ÙØ¨Ø§Ø±ÙØ Ø¨Ø§ Ø§Ø³ØªÙØ§Ø¯Ù از Ù¾Ø±ÙØªÙتاÛÙ¾âÙØ§. ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ù
Ù
ک٠است از ÙØ¨Ù ØØ¯Ø³ Ø²Ø¯Ù Ø¨Ø§Ø´ÛØ¯Ø extends Ø¨Ù Ú©ÙØ§Ø³ Rabbit ÙÛÚÚ¯Û [[Prototype]] Ù
ÛâØ¯ÙØ¯ ک٠ب٠Animal Ø±Ø¬ÙØ¹ Ù
ÛâÚ©ÙØ¯.
پس Rabbit extends Animal Ø¯Ù Ø±Ø¬ÙØ¹ [[Prototype]] Ù
ÛâØ³Ø§Ø²Ø¯:
- تابع
RabbitØ¨Ù ØµÙØ±Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û Ø§Ø² تابعAnimalØ§Ø±Ø«âØ¨Ø±Û Ù ÛâÚ©ÙØ¯. - ÙÛÚÚ¯Û
Rabbit.prototypeØ¨Ù ØµÙØ±Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û Ø§Ø²Animal.prototypeØ§Ø±Ø«âØ¨Ø±Û Ù ÛâÚ©ÙØ¯.
ب٠عÙÙØ§Ù ÛÚ© ÙØªÛØ¬ÙØ Ø§Ø±Ø«âØ¨Ø±Û ÙÙ Ø¨Ø±Ø§Û Ù ØªØ¯ÙØ§Û ٠ع٠ÙÙÛ Ú©Ø§Ø± Ù ÛâÚ©ÙØ¯ Ù ÙÙ Ø¨Ø±Ø§Û Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§.
Ø¨ÙØ±Ù اÛÛØ¯Ø Ø¨ÛØ§ÛÛØ¯ اÛÙ Ù ÙØ¶Ùع را با Ø§Ø³ØªÙØ§Ø¯Ù از کد Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ :
class Animal {}
class Rabbit extends Animal {}
// Ø¨Ø±Ø§Û Ø§ÛØ³ØªØ§Ùا
alert(Rabbit.__proto__ === Animal); // true
// Ø¨Ø±Ø§Û Ù
ØªØ¯ÙØ§Û Ù
عÙ
ÙÙÛ
alert(Rabbit.prototype.__proto__ === Animal.prototype); // true
Ø®ÙØ§ØµÙ
Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ Ø¨Ø±Ø§Û Ø¹Ù ÙÚ©Ø±Ø¯Û Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙÙØ¯ Ú©Ù Â«Ø¨Ù ØµÙØ±Øª کا٠Ù» Ø¨Ù Ú©ÙØ§Ø³ تعÙ٠دارد. اÛÙ Ù ÙØ¶Ùع ب٠ÛÚ© ÙÙ ÙÙÙ Ù ÙØ¬Ùد از Ú©ÙØ§Ø³ Ù Ø±Ø¨ÙØ· ÙÙ ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
ØªØ¯Û Ø¨Ø±Ø§Û Ù
ÙØ§Ûس٠Article.compare(article1, article2) ÛØ§ ÛÚ© Ù
تد تÙÙÛØ¯Ú©ÙÙØ¯Ù Article.createTodays().
Ø¢ÙâÙØ§ با Ú©ÙÙ
Ù static درÙ٠تعرÛÙ Ú©ÙØ§Ø³ Ø¨Ø±ÚØ³Ø¨ زد٠شدÙâØ§ÙØ¯.
ÙÛÚÚ¯ÛâÙØ§Û Ø§ÛØ³ØªØ§ ز٠اÙÛ Ú©Ù Ù Ø§ Ù ÛâØ®ÙØ§ÙÛ٠دادÙâÙØ§ÛÛ Ø¯Ø± Ø³Ø·Ø Ú©ÙØ§Ø³ Ø°Ø®ÛØ±Ù Ú©ÙÛÙ Ù ÙÙ ÚÙÛ٠ب٠ÛÚ© ÙÙ ÙÙ٠از Ú©ÙØ§Ø³ ÙØ§Ø¨Ø³ØªÙ ÙØ¨Ø§Ø´Ùد Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙÙØ¯.
سÛÙØªÚ©Ø³ Ø¢Ù:
class MyClass {
static property = ...;
static method() {
...
}
}
از ÙØØ§Ø¸ ÙÙÛØ تعرÛÙ Ú©Ø±Ø¯Ù Ø¨Ù ØµÙØ±Øª Ø§ÛØ³ØªØ§ درست ٠اÙÙØ¯ Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ø¨Ù Ø®ÙØ¯ Ú©ÙØ§Ø³ است:
MyClass.property = ...
MyClass.method = ...
ÙÛÚÚ¯ÛâÙØ§ Ù Ù ØªØ¯ÙØ§Û Ø§ÛØ³ØªØ§ ب٠ارث برد٠٠ÛâØ´ÙÙØ¯.
Ø¨Ø±Ø§Û class B extends A Ù¾Ø±ÙØªÙتاÛÙ¾ Ú©ÙØ§Ø³ B Ø®ÙØ¯Ø´ ب٠A اشار٠Ù
ÛâÚ©ÙØ¯: B.[[Prototype]] = A. پس اگر ÛÚ© ÙÛÙØ¯ درÙÙ B Ù¾ÛØ¯Ø§ ÙØ´Ø¯Ø جستâÙØ¬Ù درÙÙ A اداÙ
Ù Ù
ÛâÛØ§Ø¨Ø¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)