Sobes.tech
Middle

Маънои мероси прототип дар JavaScript чист?

sobes.tech AI

Ҷавоб аз AI

Объектҳо дар JavaScript аз хосиятҳо ва методҳо аз прототипҳои худ мерос мегиранд. Прототипи ҳар объекти дигар объект аст, ки хосиятҳо ва методҳои он тавассути занҷираи прототипҳо дастрасанд.

Ҳангоми дастрасӣ ба хосияти объекти, JavaScript аввал ба он дар худи объект меҷӯяд. Агар он пайдо накунад, ҷустуҷӯ дар прототипи он идома меёбад, сипас дар прототипи прототип ва ҳамин тавр, то он ки хосият ёфтан ё ба охири занҷира (null) расидан.

Меросгузории прототипӣ аз меросгузории классикӣ (мисли дар Java ё C++) фарқ мекунад, ки дар он объектҳо аз класе сохта мешаванд, ки сохтор ва рафторро тавсиф мекунад. Дар JavaScript, синфҳо, ки дар ES6 пайдо шудаанд, сахттар аз меросгузории прототипӣ мебошанд.

Аспектҳои асосӣ:

  • __proto__: Хосияти дохилии объект, ки ба прототипи он ишора мекунад.
  • prototype: Хосияти конструктор (функсияе, ки ҳамчун конструктор истифода мешавад), ки ба объекте ишора мекунад, ки ҳамчун прототип барои намунаҳои сохташаванда хизмат мекунад.
  • Object.getPrototypeOf(obj): Роҳи стандартӣ барои гирифтани прототипи объект.
  • Object.setPrototypeOf(obj, proto): Роҳи стандартӣ барои муайян кардани прототипи объект.

Масалан:

// Функсияи конструктор
function Animal(name) {
  this.name = name;
}

// Илова кардани метод ба прототипи Animal
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// Сохтани намуна
const dog = new Animal("Buddy");

// Фонксияи метод аз прототип
dog.sayHello(); // Натиҷа: Hello, my name is Buddy

// Прототипи dog — ин Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Натиҷа: true

// Прототипи Animal.prototype — ин Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Натиҷа: true

// Охири занҷираи прототипҳо — null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Натиҷа: true

Мувофиқати бо меросгузории классикӣ (бо истифода аз синфҳои ES6):

class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Даъвати конструктори синфи падар
    this.breed = breed;
  }

  bark() {
    console.log("Woof!");
  }
}

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Натиҷа: Hello, my name is Buddy (мерос аз Animal)
buddy.bark(); // Натиҷа: Woof! (методи Dog)

// Синфҳо дар ES6 — сахттар аз прототипҳо
console.log(Object.getPrototypeOf(Dog) === Animal); // Натиҷа: true (мерос байни синфҳо)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Натиҷа: true (мерос аз методҳо тавассути прототипҳо)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Натиҷа: true (намудан аз прототипи синф)

Меросгузории прототипӣ — асосии консепсияи JavaScript, ки фаҳмидани он барои корбарии самараноки забон зарур аст.