Як вÑдомо, ми можемо ÑÑвоÑÑваÑи Ð½Ð¾Ð²Ñ Ð¾Ð±âÑкÑи за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа, оÑÑ Ñак new F().
ЯкÑо в F.prototype мÑÑÑиÑÑÑÑ Ð¾Ð±âÑкÑ, Ñо опеÑаÑÐ¾Ñ new авÑомаÑиÑно вÑÑановлÑÑ Ñой обâÑÐºÑ Ð² [[Prototype]] Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾ÑÑвоÑеного обâÑкÑа.
JavaScript викоÑиÑÑовÑвала пÑоÑоÑипне наÑлÑдÑÐ²Ð°Ð½Ð½Ñ Ð· моменÑÑ ÑвоÑÑ Ð¿Ð¾Ñви. Це одна з оÑобливоÑÑей ÑÑÑÑ Ð¼Ð¾Ð²Ð¸.
Ðле ÑанÑÑе, в Ð´Ð°Ð²Ð½Ñ ÑаÑи, пÑÑмого доÑÑÑÐ¿Ñ Ð´Ð¾ пÑоÑоÑипа в обâÑкÑа не бÑло. ÐадÑйно пÑаÑÑвала лиÑе влаÑÑивÑÑÑÑ âprototypeâ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа, опиÑане в ÑÑÐ¾Ð¼Ñ ÑоздÑлÑ. Ð¢Ð¾Ð¼Ñ ÑÑ Ð²Ð»Ð°ÑÑивÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ Ð² багаÑÑÐ¾Ñ ÑкÑипÑÐ°Ñ .
ÐаÑважÑе, Ñо F.prototype ÑÑÑ Ñ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ, ÑÐºÑ Ð½Ð°Ð·Ð²Ð°Ð»Ð¸ "prototype" в обâÑкÑÑ F. Це звÑÑиÑÑ Ð´Ñже ÑпÑвзвÑÑно з ÑеÑмÑном âprototypeâ, але ÑÑÑ Ñе ознаÑÐ°Ñ Ð²ÑÑого Ð»Ð¸Ñ Ð·Ð²Ð¸Ñайне ÑмâÑ Ð²Ð»Ð°ÑÑивоÑÑÑ.
ÐÑÑ Ð¿Ñиклад:
let animal = {
eats: true
};
function Rabbit(name) {
this.name = name;
}
Rabbit.prototype = animal;
let rabbit = new Rabbit("ÐÑлий кÑолик"); // rabbit.__proto__ == animal
alert( rabbit.eats ); // true
ÐиÑаз Rabbit.prototype = animal доÑлÑвно ознаÑÐ°Ñ Ð½Ð°ÑÑÑпне: âколи бÑде ÑÑвоÑено new Rabbit, його влаÑÑивÑÑÑÑ [[Prototype]] Ð¼Ð°Ñ Ð¿Ð¾ÑилаÑиÑÑ Ð½Ð° обâÑÐºÑ animalâ.
ÐÑÑ ÐºÑнÑева каÑÑинка:
Ðа каÑÑинÑÑ, "prototype" Ñо зобÑажена бÑÐ»Ñ Ð³Ð¾ÑизонÑалÑÐ½Ð¾Ñ ÑÑÑÑлки â Ñе звиÑайна влаÑÑивÑÑÑÑ, а [[Prototype]], Ñо зобÑажена бÑÐ»Ñ Ð²ÐµÑÑикалÑÐ½Ð¾Ñ ÑÑÑÑлки â вказÑÑ Ð½Ð° Ñе, Ñо rabbit ÑÑпадковÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð²Ñд Ñвого пÑоÑоÑипа animal.
F.prototype викоÑиÑÑовÑÑÑÑÑÑ ÑÑлÑки Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа new FF.prototype викоÑиÑÑовÑÑÑÑÑÑ ÑÑлÑки пÑи Ð²Ð¸ÐºÐ»Ð¸ÐºÑ new F Ñ Ð¿ÑиÑвоÑÑÑÑÑÑ Ð² ÑкоÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ [[Prototype]] нового обâÑкÑа.
ЯкÑо пÑÑÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ F.prototype змÑниÑÑÑÑ (F.prototype = <ÑнÑий об'ÑкÑ>), Ñо Ð½Ð¾Ð²Ñ Ð¾Ð±âÑкÑи, ÑÑвоÑÐµÐ½Ñ Ð· Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ new F, бÑдÑÑÑ Ð¼Ð°Ñи в ÑкоÑÑÑ [[Prototype]] ÑнÑий обâÑкÑ, а вже ÑÑнÑÑÑÑ Ð¾Ð±âÑкÑи бÑдÑÑÑ Ð¿Ð¾ÑилаÑиÑÑ Ð½Ð° ÑÑаÑий.
Типове знаÑÐµÐ½Ð½Ñ F.prototype, влаÑÑивоÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа
Ðожна ÑÑнкÑÑÑ Ð·Ð° замовÑÑваннÑм Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ "prototype", навÑÑÑ ÑкÑо ми ÑÑ Ð²Ð»Ð°ÑÑивÑÑÑÑ ÑÐ°Ð¼Ñ Ð½Ðµ пÑопиÑÑÑмо.
Ðа замовÑÑваннÑм âprototypeâ Ñ Ð¾Ð±âÑкÑом з однÑÑÑ ÑÐ´Ð¸Ð½Ð¾Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ constructor, Ñка поÑилаÑÑÑÑÑ Ð½Ð° ÑÐ°Ð¼Ñ Ð¶ ÑÑнкÑÑÑ.
ÐÑÑ Ñк ÑÑÑ:
function Rabbit() {}
/* знаÑÐµÐ½Ð½Ñ prototype, Ñке пÑизнаÑаÑÑÑÑÑ Ð·Ð° замовÑеннÑм
Rabbit.prototype = { constructor: Rabbit };
*/
Ðожемо пеÑевÑÑиÑи Ñе:
function Rabbit() {}
// за замовÑÑваннÑм:
// Rabbit.prototype = { constructor: Rabbit }
alert( Rabbit.prototype.constructor == Rabbit ); // true
ÐÑ Ð¹ логÑÑно, ÑкÑо ми ÑÐ°Ð¼Ñ Ð½ÑÑого з влаÑÑивÑÑÑÑ constructor не Ñобимо, Ñо вона Ñ Ð´Ð¾ÑÑÑпна Ð´Ð»Ñ Ð²ÑÑÑ
обâÑкÑÑв rabbit ÑеÑез [[Prototype]]:
function Rabbit() {}
// за замовÑÑваннÑм:
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // ÑÑпадковÑÑ Ð²Ñд {constructor: Rabbit}
alert(rabbit.constructor == Rabbit); // true (вÑд пÑоÑоÑипÑ)
Ðи можемо викоÑиÑÑовÑваÑи влаÑÑивÑÑÑÑ constructor Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ
обâÑкÑÑв викоÑиÑÑовÑÑÑи ÑÑ ÑÐ°Ð¼Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑ, Ñк Ñ Ð´Ð»Ñ Ð²Ð¶Ðµ ÑÑнÑÑÑиÑ
.
Як ÑÑÑ:
function Rabbit(name) {
this.name = name;
alert(name);
}
let rabbit = new Rabbit("ÐÑлий кÑолик");
let rabbit2 = new rabbit.constructor("ЧоÑний кÑолик");
Це дÑже пÑакÑиÑно Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑкÑо ми маÑмо обâÑкÑ, не знаÑмо за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ñкого Ñаме конÑÑÑÑкÑоÑа Ñой обâÑÐºÑ Ð±Ñв ÑÑвоÑений (до пÑÐ¸ÐºÐ»Ð°Ð´Ñ ÑкÑо вÑн бÑв ÑмпоÑÑований з ÑкоÑÑÑ Ð±ÑблÑоÑеки), а нам поÑÑÑбно ÑÑвоÑиÑи новий обâÑÐºÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ Ñого, Ñо вже ÑÑнÑÑ.
Ðле найважливÑÑим моменÑом Ñодо "constructor" Ñ Ñе, Ñоâ¦
â¦Ð¡Ð°Ð¼Ð° мова JavaScript не забезпеÑÑÑ Ð¿ÑавилÑного знаÑÐµÐ½Ð½Ñ "constructor".
Так, constructor ÑÑнÑÑ Ð·Ð° замовÑÑваннÑм Ñ Ð²Ð»Ð°ÑÑивоÑÑÑÑ
"prototype" Ð´Ð»Ñ ÑÑнкÑÑй, але Ñе й ÑÑе. ÐодалÑÑа Ð´Ð¾Ð»Ñ "constructor" повнÑÑÑÑ Ð² наÑиÑ
ÑÑкаÑ
.
Ð Ñаме, ÑкÑо ми замÑнимо деÑолÑне знаÑÐµÐ½Ð½Ñ prototype на ÑкеÑÑ ÑнÑе, ÑÐ¾Ð´Ñ Ð² prototype не бÑде нÑÑкого "constructor".
ÐапÑиклад:
function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false
ÐÑже, Ñоб маÑи пÑавилÑний "constructor", замÑÑÑÑ ÑÑлком замÑнÑÑи деÑолÑний prototype ÑкимоÑÑ Ð½Ð°Ñим ÑнÑим обâÑкÑом, ми можемо пÑоÑÑо додаваÑи або видалÑÑи влаÑÑивоÑÑÑ Ð´Ð¾ Ñже наÑвного деÑолÑного "prototype":
function Rabbit() {}
// ТÑÑ Ð¼Ð¸ не замÑнÑÑмо ÑÑлковиÑо влаÑÑивÑÑÑÑ Rabbit.prototype
// а пÑоÑÑо додаÑмо до неÑ
Rabbit.prototype.jumps = true
// а ÑÐ¾Ð¼Ñ Ð´ÐµÑолÑне Rabbit.prototype.constructor збеÑÑгаÑÑÑÑÑ
Ñи оÑÑ ÑнÑий ваÑÑанÑ, вÑдновлÑÑмо constructor вÑÑÑнÑ:
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// Ñ ÑепеÑ, constructor Ñакож пÑавилÑний, ÑÐ¾Ð¼Ñ Ñо ми додали його вÑÑÑнÑ
ÐÑдÑÑмок
Ð ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð±Ñло коÑоÑко опиÑано ÑлÑÑ
Ð´Ð»Ñ Ð²ÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÑиÑ
Ð¾Ð²Ð°Ð½Ð¾Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ [[Prototype]] обâÑкÑÑв, ÑÐºÑ Ð±Ñли ÑÑвоÑÐµÐ½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа. ÐÑзнÑÑе, бÑде надано бÑлÑÑе пÑикладÑв кодÑ, ÑÐºÑ Ð¿Ð¾ÐºÐ»Ð°Ð´Ð°ÑÑÑÑÑ Ð½Ð° ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ.
ÐÑе доÑиÑÑ Ð¿ÑоÑÑо, ÑÑлÑки ÑÑеба додаÑи кÑлÑка деÑалей Ñоб ÑÑе бÑло зÑозÑмÑло:
- ÐлаÑÑивÑÑÑÑ Ð¾Ð±âÑкÑа
F.prototype(Ð½Ñ Ð² ÑÐºÐ¾Ð¼Ñ ÑÐ°Ð·Ñ Ð½Ðµ[[Prototype]]) вÑÑановлÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð²Ð°Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ[[Prototype]]нового обâÑкÑа, ÑÑлÑки ÑодÑ, коли бÑде викликана ÑеÑезnew F(). - ÐнаÑÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ
F.prototypeможе бÑÑи або поÑиланнÑм на обâÑкÑ, абоnull: ÑнÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð½Ðµ ÑпÑаÑÑÑÑÑ. - ТÑлÑки влаÑÑивÑÑÑÑ
"prototype"Ð¼Ð°Ñ Ñакий ÑпеÑÑалÑний еÑекÑ: може вÑÑановлÑваÑиÑÑ Ð² конÑÑÑÑкÑоÑÑ Ñа може викликаÑиÑÑ ÑеÑез опеÑаÑоÑnew.
У звиÑайниÑ
обâÑкÑаÑ
влаÑÑивÑÑÑÑ prototype не Ñ ÑимоÑÑ ÑпеÑÑалÑним:
let user = {
name: "John",
prototype: "Bla-bla" // Ð½ÐµÐ¼Ð°Ñ Ð½ÑÑÐºÐ¾Ñ Ð¼Ð°Ð³ÑÑ
};
Ðа замовÑÑваннÑм, ÑÑÑ ÑÑнкÑÑÑ Ð¼Ð°ÑÑÑ F.prototype = { constructor: F }, Ñ Ð¼Ð¸ можемо оÑÑимаÑи конÑÑÑÑкÑÐ¾Ñ Ð¾Ð±âÑкÑа ÑеÑез його влаÑÑивÑÑÑÑ "constructor".
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)