Sobes.tech
Middle

Прототипҳо дар JavaScript чистанд?

sobes.tech AI

Ҷавоб аз AI

У JavaScript аб'екты могуць наследваць уласцівасці і метады ад іншых аб'ектаў праз механізм протатыпаў. Кожны аб'ект у JavaScript мае ўнутранае схаванае ўласцівасць [[Prototype]], якое паказвае на іншы аб'ект, які з'яўляецца яго протатыпам. Калі адбываецца зварот да ўласцівасці або метаду аб'екта, рухавік JavaScript спачатку шукае яго ў самім аб'екце. Калі не знаходзіць, ён звяртаецца да ўласцівасці [[Prototype]] і шукае ў протатыпе. Гэты працэс паўтараецца па ланцужку протатыпаў, пакуль уласцівасць не будзе знойдзена або пакуль не дасягне null (канец ланцужка).

Асноўныя канцэпцыі:

  • Ланцужок протатыпаў: Паслядоўнасць аб'ектаў, звязаных праз уласцівасць [[Prototype]].
  • Наследаванне: Аб'екты наследуюць уласцівасці і метады сваіх протатыпаў.
  • __proto__: Гістарычна выкарыстоўвалася (хоць і не стандартна з першапачатковага) уласцівасць для доступу да [[Prototype]]. Цяпер рэкамендуецца выкарыстоўваць Object.getPrototypeOf().
  • prototype: Уласцівасць канструктара, на якое спасылаецца [[Prototype]] экземпляраў, створаных з дапамогай гэтага канструктара.

Прыклад з канструктарам і протатыпам:

// Канструктар
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Дадаем метад у протатып
Person.prototype.sayHello = function() {
  console.log("Прывітанне, мяне клічуць " + this.name);
};

// Ствараем экземпляр
const person1 = new Person("Alice", 30);

// Выклікаем метад з протатыпу
person1.sayHello(); // Выхад: Прывітанне, мяне клічуць Alice

// Доступ да протатыпу экземпляра
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Выхад: true

У гэтым прыкладзе:

  • Person — гэта функцыя-канструктар.
  • Person.prototype — аб'ект, які з'яўляецца протатыпам для ўсіх экземпляраў, створаных з дапамогай new Person().
  • sayHello — метад, дададзены ў протатып. Усе экземпляры Person наследуюць гэты метад.
  • Калі выклікаецца person1.sayHello(), рухавік JavaScript шукае sayHello у person1. Калі не знаходзіць, ён звяртаецца да [[Prototype]] person1 (які роўны Person.prototype) і знаходзіць метад там.

Протатыпы забяспечваюць эфектыўнае выкарыстанне памяці, бо метады і агульныя ўласцівасці захоўваюцца ў протатыпе, а не дублююцца ў кожным экземпляры аб'екта.