ÐÐ¾Ð´ÐµÐ»Ñ Ð½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² JavaScript Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð·Ð°Ð´Ð°ÑиÑÑ Ð¾Ð¿ÑÑнÑÑ
ÑазÑабоÑÑиков на вÑÑокоÑÑовневÑÑ
обÑекÑно-оÑиенÑиÑованнÑÑ
ÑзÑкаÑ
(ÑакиÑ
, напÑимеÑ, как Java или C++), поÑколÑÐºÑ Ð¾Ð½Ð° динамиÑеÑÐºÐ°Ñ Ð¸ не вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ ÑеализаÑÐ¸Ñ Ð¿Ð¾Ð½ÑÑÐ¸Ñ class
(Ñ
оÑÑ ÐºÐ»ÑÑевое Ñлово class
, бÑвÑее долгие Ð³Ð¾Ð´Ñ Ð·Ð°ÑезеÑвиÑованнÑм, и пÑиобÑело пÑакÑиÑеÑкое знаÑение в ÑÑандаÑÑе ES2015, однако, клаÑÑÑ Ð² JavaScript пÑедÑÑавлÑÑÑ Ñобой лиÑÑ "ÑинÑакÑиÑеÑкий ÑаÑ
аÑ" повеÑÑ
пÑоÑоÑипно-оÑиенÑиÑованной модели наÑледованиÑ).
Рплане наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ JavaScript ÑабоÑÐ°ÐµÑ Ð»Ð¸ÑÑ Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑноÑÑÑÑ: обÑекÑами. ÐаждÑй обÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ Ð²Ð½ÑÑÑеннÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° дÑÑгой обÑекÑ, назÑваемÑй его пÑоÑоÑипом. У обÑекÑа-пÑоÑоÑипа Ñакже еÑÑÑ Ñвой ÑобÑÑвеннÑй пÑоÑоÑип и Ñак далее до ÑеÑ
поÑ, пока ÑепоÑка не завеÑÑиÑÑÑ Ð¾Ð±ÑекÑом, Ñ ÐºÐ¾ÑоÑого ÑвойÑÑво prototype Ñавно null
. Ðо опÑеделениÑ, null
не Ð¸Ð¼ÐµÐµÑ Ð¿ÑоÑоÑипа и ÑвлÑеÑÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑим звеном в ÑепоÑке пÑоÑоÑипов.
ХоÑÑ Ð¿ÑоÑоÑипнÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑÑе оÑноÑÑÑ Ðº недоÑÑаÑкам JavaScript, на Ñамом деле она моÑнее клаÑÑиÑеÑкой. РпÑимеÑÑ, повеÑÑ Ð½ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑеделÑно пÑоÑÑо ÑеализоваÑÑ ÐºÐ»Ð°ÑÑиÑеÑкое наÑледование, а Ð²Ð¾Ñ Ð¿Ð¾Ð¿ÑÑки ÑовеÑÑиÑÑ Ð¾Ð±ÑаÑное непÑеменно вÑнÑдÑÑ Ð²Ð°Ñ Ð¿Ð¾Ð¿Ð¾ÑеÑÑ.
ÐаÑледование Ñ ÑепоÑкой пÑоÑоÑипов ÐаÑледование ÑвойÑÑвÐбÑекÑÑ Ð² JavaScript â динамиÑеÑкие "конÑейнеÑÑ", наполненнÑе ÑвойÑÑвами (назÑваемÑми ÑобÑÑвеннÑми ÑвойÑÑвами). ÐаждÑй обÑÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° Ñвой обÑекÑ-пÑоÑоÑип. ÐÑи попÑÑке полÑÑиÑÑ Ð´Ð¾ÑÑÑп к какомÑ-либо ÑвойÑÑÐ²Ñ Ð¾Ð±ÑекÑа, ÑвойÑÑво внаÑале иÑеÑÑÑ Ð² Ñамом обÑекÑе, заÑем в пÑоÑоÑипе обÑекÑа, поÑле Ñего в пÑоÑоÑипе пÑоÑоÑипа, и Ñак далее. ÐоиÑк ведÑÑÑÑ Ð´Ð¾ ÑÐµÑ Ð¿Ð¾Ñ, пока не найдено ÑвойÑÑво Ñ ÑовпадаÑÑим именем или не доÑÑигнÑÑ ÐºÐ¾Ð½ÐµÑ ÑепоÑки пÑоÑоÑипов.
// Ð ÑÑом пÑимеÑе someObject.[[Prototype]] ознаÑÐ°ÐµÑ Ð¿ÑоÑоÑип someObject.
// ÐÑо ÑпÑоÑÑÐ½Ð½Ð°Ñ Ð½Ð¾ÑаÑÐ¸Ñ (опиÑÐ°Ð½Ð½Ð°Ñ Ð² ÑÑандаÑÑе ECMAScript).
// Ðна не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзована в ÑеалÑнÑÑ
ÑкÑипÑаÑ
.
// ÐопÑÑÑим, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¾Ð±ÑÐµÐºÑ 'o' Ñ ÑобÑÑвеннÑми ÑвойÑÑвами a и b
// {a:1, b:2}
// o.[[Prototype]] Ð¸Ð¼ÐµÐµÑ ÑвойÑÑва b и Ñ
// {b:3, c:4}
// Ðалее, o.[[Prototype]].[[Prototype]] ÑвлÑеÑÑÑ null
// null - ÑÑо оконÑание в ÑепоÑке пÑоÑоÑипов
// по опÑеделениÑ, null не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑва [[Prototype]]
// РиÑоге Ð¿Ð¾Ð»Ð½Ð°Ñ ÑепоÑка пÑоÑоÑипов вÑглÑÐ´Ð¸Ñ Ñак:
// {a:1, b:2} ---> {b:3, c:4} ---> null
console.log(o.a); // 1
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа 'o' ÑобÑÑвенное ÑвойÑÑво 'a'?
// Ðа, и его знаÑение Ñавно 1
console.log(o.b); // 2
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа 'o' ÑобÑÑвенное ÑвойÑÑво 'b'?
// Ðа, и его знаÑение Ñавно 2.
// У пÑоÑоÑипа o.[[Prototype]] Ñакже еÑÑÑ ÑвойÑÑво 'b',
// но обÑаÑÐµÐ½Ð¸Ñ Ðº Ð½ÐµÐ¼Ñ Ð² данном ÑлÑÑае не пÑоиÑÑ
одиÑ.
// ÐÑо и назÑваеÑÑÑ "property shadowing" (заÑенение ÑвойÑÑва)
console.log(o.c); // 4
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа 'o' ÑобÑÑвенное ÑвойÑÑво 'Ñ'?
// ÐеÑ, Ñогда поиÑем его в пÑоÑоÑипе.
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа o.[[Prototype]] ÑобÑÑвенное ÑвойÑÑво 'Ñ'?
// Ðа, оно Ñавно 4
console.log(o.d); // undefined
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа 'o' ÑобÑÑвенное ÑвойÑÑво 'd'?
// ÐеÑ, Ñогда поиÑем его в пÑоÑоÑипе.
// ÐÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа o.[[Prototype]] ÑобÑÑвенное ÑвойÑÑво 'd'?
// ÐеÑ, пÑодолжаем поиÑк по ÑепоÑке пÑоÑоÑипов.
// o.[[Prototype]].[[Prototype]] Ñавно null, пÑекÑаÑаем поиÑк,
// ÑвойÑÑво не найдено, возвÑаÑаем undefined
ÐÑи добавлении к обÑекÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑвойÑÑва, ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ ÑобÑÑвенное ÑвойÑÑво. ÐдинÑÑвеннÑм иÑклÑÑением из ÑÑого пÑавила ÑвлÑÑÑÑÑ Ð½Ð°ÑледÑемÑе ÑвойÑÑва, имеÑÑие getter или setter.
ÐаÑледование "меÑодов"JavaScript не Ð¸Ð¼ÐµÐµÑ "меÑодов" в ÑмÑÑле, пÑинÑÑом в клаÑÑиÑеÑкой модели ÐÐÐ. Ð JavaScript лÑÐ±Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° к обÑекÑÑ Ð² виде его ÑвойÑÑва. УнаÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ ÑоÑно Ñак же, как лÑбое дÑÑгое ÑвойÑÑво обÑекÑа, в Ñом ÑиÑле и в плане "заÑÐµÐ½ÐµÐ½Ð¸Ñ ÑвойÑÑв" (property shadowing), как показано в пÑимеÑе вÑÑе (в данном конкÑеÑном ÑлÑÑае ÑÑо ÑоÑма пеÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑода - method overriding).
ÐÑи вÑполнении ÑнаÑледованной ÑÑнкÑии знаÑение this
(/ru/docs/Web/JavaScript/Reference/Operators/this) ÑказÑÐ²Ð°ÐµÑ Ð½Ð° обÑекÑ-поÑомок, а не на пÑоÑоÑип, в коÑоÑом ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ ÑобÑÑвеннÑм ÑвойÑÑвом.
var o = {
a: 2,
m: function () {
return this.a + 1;
},
};
console.log(o.m()); // 3
// в ÑÑом ÑлÑÑае пÑи вÑзове 'o.m' this ÑказÑÐ²Ð°ÐµÑ Ð½Ð° 'o'
var p = Object.create(o);
// 'p' - поÑомок 'o'
p.a = 12; // ÑоздаÑÑ ÑобÑÑвенное ÑвойÑÑво 'a' обÑекÑа 'p'
console.log(p.m()); // 13
// пÑи вÑзове 'p.m' this ÑказÑÐ²Ð°ÐµÑ Ð½Ð° 'p'.
// Ñ.е. когда 'p' наÑледÑÐµÑ ÑÑнкÑÐ¸Ñ 'm' обÑекÑа 'o',
// this.a ознаÑÐ°ÐµÑ 'p.a', ÑобÑÑвенное ÑвойÑÑво 'a' обÑекÑа 'p'
РазлиÑнÑе ÑпоÑÐ¾Ð±Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов и полÑÑаемÑе в иÑоге ÑепоÑки пÑоÑоÑипов Создание обÑекÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð»Ð¸ÑеÑалов
var o = { a: 1 };
// СозданнÑй обÑÐµÐºÑ 'o' Ð¸Ð¼ÐµÐµÑ Object.prototype в каÑеÑÑве Ñвоего [[Prototype]]
// Ñ 'o' Ð½ÐµÑ ÑобÑÑвенного ÑвойÑÑва 'hasOwnProperty'
// hasOwnProperty â ÑÑо ÑобÑÑвенное ÑвойÑÑво Object.prototype.
// Таким обÑазом 'o' наÑледÑÐµÑ hasOwnProperty Ð¾Ñ Object.prototype
// Object.prototype в каÑеÑÑве пÑоÑоÑипа Ð¸Ð¼ÐµÐµÑ null.
// o ---> Object.prototype ---> null
var a = ["yo", "whadup", "?"];
// ÐаÑÑÐ¸Ð²Ñ Ð½Ð°ÑледÑÑÑÑÑ Ð¾Ñ Array.prototype
// (Ñ ÐºÐ¾ÑоÑого еÑÑÑ Ñакие меÑодÑ, как indexOf, forEach и Ñ.п.).
// ЦепоÑка пÑоÑоÑипов пÑи ÑÑом вÑглÑÐ´Ð¸Ñ Ñак:
// a ---> Array.prototype ---> Object.prototype ---> null
function f() {
return 2;
}
// ФÑнкÑии наÑледÑÑÑÑÑ Ð¾Ñ Function.prototype
// (Ñ ÐºÐ¾ÑоÑого еÑÑÑ Ñакие меÑодÑ, как call, bind и Ñ.п.):
// f ---> Function.prototype ---> Object.prototype ---> null
Создание обÑекÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа
Ð JavaScript "конÑÑÑÑкÑоÑ" â ÑÑо "пÑоÑÑо" ÑÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ñ Ð¾Ð¿ÐµÑаÑоÑом new.
function Graph() {
this.vertexes = [];
this.edges = [];
}
Graph.prototype = {
addVertex: function (v) {
this.vertexes.push(v);
},
};
var g = new Graph();
// обÑÐµÐºÑ 'g' Ð¸Ð¼ÐµÐµÑ ÑобÑÑвеннÑе ÑвойÑÑва 'vertexes' и 'edges'.
// g.[[Prototype]] пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение Graph.prototype пÑи вÑполнении new Graph().
Object.create
Ð ECMAScript 5 пÑедÑÑавлен новÑй меÑод ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов: Object.create. ÐÑоÑоÑип Ñоздаваемого обÑекÑа ÑказÑваеÑÑÑ Ð² пеÑвом аÑгÑменÑе ÑÑого меÑода:
var a = { a: 1 };
// a ---> Object.prototype ---> null
var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 (ÑнаÑледовано)
var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null
var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty);
// undefined, Ñ.к. 'd' не наÑледÑеÑÑÑ Ð¾Ñ Object.prototype
ÐÑполÑзÑÑ ÐºÐ»ÑÑевое Ñлово class
С вÑÑ
одом ECMAScript 6 поÑвилÑÑ ÑелÑй Ð½Ð°Ð±Ð¾Ñ ÐºÐ»ÑÑевÑÑ
Ñлов, ÑеализÑÑÑиÑ
клаÑÑÑ. Ðни могÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼Ñми лÑдÑм, изÑÑавÑим ÑзÑки, оÑнованнÑе на клаÑÑаÑ
, но еÑÑÑ ÑÑÑеÑÑвеннÑе оÑлиÑиÑ. JavaScript бÑл и оÑÑаÑÑÑÑ Ð¿ÑоÑоÑипно-оÑиенÑиÑованнÑм ÑзÑком. ÐовÑе клÑÑевÑе Ñлова: "class
", "constructor
", "static
", "extends
" и "super
".
"use strict";
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
class Square extends Polygon {
constructor(sideLength) {
super(sideLength, sideLength);
}
get area() {
return this.height * this.width;
}
set sideLength(newLength) {
this.height = newLength;
this.width = newLength;
}
}
var square = new Square(2);
ÐÑоизводиÑелÑноÑÑÑ
ÐлиÑелÑное вÑÐµÐ¼Ñ Ð¿Ð¾Ð¸Ñка ÑвойÑÑв, ÑаÑполагаÑÑÐ¸Ñ ÑÑ Ð¾ÑноÑиÑелÑно вÑÑоко в ÑепоÑке пÑоÑоÑипов, Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÐ³Ð°Ñивно ÑказаÑÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑи (performance), оÑобенно в кÑиÑиÑеÑÐºÐ¸Ñ Ð² ÑÑом ÑмÑÑле меÑÑÐ°Ñ ÐºÐ¾Ð´Ð°. ÐÑоме Ñого, попÑÑка найÑи неÑÑÑеÑÑвÑÑÑие ÑвойÑÑва неизбежно пÑиведÑÑ Ðº пÑовеÑке на Ð¸Ñ Ð½Ð°Ð»Ð¸Ñие Ñ Ð²ÑÐµÑ Ð¾Ð±ÑекÑов ÑепоÑки пÑоÑоÑипов.
ÐÑоме Ñого, пÑи ÑиклиÑеÑком пеÑебоÑе ÑвойÑÑв обÑекÑа бÑÐ´ÐµÑ Ð¾Ð±ÑабоÑано каждое ÑвойÑÑво, пÑиÑÑÑÑÑвÑÑÑее в ÑепоÑке пÑоÑоÑипов.
ÐÑли вам необÑ
одимо пÑовеÑиÑÑ, опÑеделено ли ÑвойÑÑво Ñ Ñамого обÑекÑа, а не где-Ñо в его ÑепоÑке пÑоÑоÑипов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼ÐµÑод hasOwnProperty
, коÑоÑÑй вÑе обÑекÑÑ Ð½Ð°ÑледÑÑÑ Ð¾Ñ Object.prototype
.
hasOwnProperty
â единÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÑÑÑеÑÑвÑÑÑÐ°Ñ Ð² JavaScript возможноÑÑÑ ÑабоÑаÑÑ Ñо ÑвойÑÑвами, не заÑÑÐ°Ð³Ð¸Ð²Ð°Ñ ÑепоÑÐºÑ Ð¿ÑоÑоÑипов.
ÐÑимеÑание: ÐÐ»Ñ Ð¿ÑовеÑки ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑва недоÑÑаÑоÑно пÑовеÑÑÑÑ, ÑквиваленÑно ли оно undefined
. СвойÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ Ñебе ÑÑÑеÑÑвоваÑÑ, но пÑи ÑÑом ÐµÐ¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑиÑвоено знаÑение undefined
.
Ðдной из ÑаÑÑÑÑ
оÑибок ÑвлÑеÑÑÑ ÑаÑÑиÑение Object.prototype
или дÑÑгиÑ
базовÑÑ
пÑоÑоÑипов.
Такой Ð¿Ð¾Ð´Ñ Ð¾Ð´ назÑваеÑÑÑ monkey patching и наÑÑÑÐ°ÐµÑ Ð¿ÑинÑип инкапÑÑлÑÑии. ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ñанее он иÑполÑзовалÑÑ Ð² ÑÐ°ÐºÐ¸Ñ ÑиÑоко ÑаÑпÑоÑÑÑанÑннÑÑ ÑÑеймвоÑÐºÐ°Ñ , как напÑимеÑ, Prototype.js, в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ ÑÑÑеÑÑвÑÐµÑ ÑазÑмнÑÑ Ð¿ÑиÑин Ð´Ð»Ñ ÐµÐ³Ð¾ иÑполÑзованиÑ, поÑколÑÐºÑ Ð² данном ÑлÑÑае вÑÑÑоеннÑе ÑÐ¸Ð¿Ñ "Ð·Ð°Ñ Ð»Ð°Ð¼Ð»ÑÑÑÑÑ" дополниÑелÑной неÑÑандаÑÑной ÑÑнкÑионалÑноÑÑÑÑ.
ÐдинÑÑвеннÑм опÑавданием ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ
пÑоÑоÑипов могÑÑ ÑвлÑÑÑÑÑ Ð»Ð¸ÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸Ð»Ñ - ÑмÑлÑÑоÑÑ Ð½Ð¾Ð²Ð¾Ð¹ ÑÑнкÑионалÑноÑÑи (напÑимеÑ, Array.forEach)
Ð´Ð»Ñ Ð½Ðµ поддеÑживаÑÑиÑ
ÐµÑ ÑеализаÑий ÑзÑка в ÑÑаÑÑÑ
веб-бÑаÑзеÑаÑ
.
B
наÑледÑÐµÑ Ð¾Ñ A
:
function A(a) {
this.varA = a;
}
// What is the purpose of including varA in the prototype when A.prototype.varA will always be shadowed by
// this.varA, given the definition of function A above?
A.prototype = {
varA: null, // Shouldn't we strike varA from the prototype as doing nothing?
// perhaps intended as an optimization to allocate space in hidden classes?
// https://developers.google.com/speed/articles/optimizing-javascript#Initializing instance variables
// would be valid if varA wasn't being initialized uniquely for each instance
doSomething: function () {
// ...
},
};
function B(a, b) {
A.call(this, a);
this.varB = b;
}
B.prototype = Object.create(A.prototype, {
varB: {
value: null,
enumerable: true,
configurable: true,
writable: true,
},
doSomething: {
value: function () {
// пеÑеопÑеделение
A.prototype.doSomething.apply(this, arguments); // call super
// ...
},
enumerable: true,
configurable: true,
writable: true,
},
});
B.prototype.constructor = B;
var b = new B();
b.doSomething();
Ðажно:
.prototype
Object.create()
Ðак Ñже ÑпоминалоÑÑ, JavaScript Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑаÑÑ ÑазÑабоÑÑиков на Java или C++, Ð²ÐµÐ´Ñ Ð² нÑм ÑовеÑÑенно Ð½ÐµÑ "ноÑмалÑнÑÑ " клаÑÑов. ÐÑÑ, ÑÑо Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ - лиÑÑ Ð¾Ð±ÑекÑÑ. Ðаже Ñе "classes", коÑоÑÑе Ð¼Ñ Ð¸Ð¼Ð¸ÑиÑовали в ÑÑаÑÑе, Ñоже ÑвлÑÑÑÑÑ ÑÑнкÑионалÑнÑми обÑекÑами.
ÐÑ Ð½Ð°Ð²ÐµÑнÑка замеÑили, ÑÑо Ñ function A
еÑÑÑ Ð¾Ñобое ÑвойÑÑво prototype
. ÐÑо ÑвойÑÑво ÑабоÑÐ°ÐµÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом new
. СÑÑлка на обÑекÑ-пÑоÑоÑип копиÑÑеÑÑÑ Ð²Ð¾ внÑÑÑеннее ÑвойÑÑво [[Prototype]]
нового обÑекÑа. ÐапÑимеÑ, в ÑÑом ÑлÑÑае var a1 = new A()
, JavaScript (поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа в памÑÑи и до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии function A()
) ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ a1.[[Prototype]] = A.prototype
. ÐоÑом, пÑи попÑÑке доÑÑÑпа к ÑвойÑÑÐ²Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑкземплÑÑа обÑекÑа, JavaScript пÑовеÑÑеÑ, пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð»Ð¸ ÑвойÑÑво непоÑÑедÑÑвенно обÑекÑÑ. ÐÑли неÑ, Ñо инÑеÑпÑеÑаÑÐ¾Ñ Ð¸ÑÐµÑ Ð² ÑвойÑÑве [[Prototype]]
. ÐÑÑ, ÑÑо бÑло опÑеделено в prototype,
в Ñавной ÑÑепени доÑÑÑпно и вÑем ÑкземплÑÑам данного обÑекÑа. ÐÑи внеÑении изменений в prototype
вÑе ÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÐ°Ð·Ñ Ð¶Ðµ ÑÑановÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми и вÑем ÑкземплÑÑам обÑекÑа.
[[Prototype]]
ÑабоÑÐ°ÐµÑ ÑекÑÑÑивно, Ñо еÑÑÑ Ð¿Ñи вÑзове:
JavaScript на Ñамом деле вÑполнÑÐµÑ ÑÑо-Ñо подобное:
var o = new Object();
o.[[Prototype]] = Foo.prototype;
Foo.call(o);
а когда Ð²Ñ Ð´ÐµÐ»Ð°ÐµÑе Ñак:
JavaScript пÑовеÑÑеÑ, еÑÑÑ Ð»Ð¸ Ñ o
ÑвойÑÑво someProp
. и еÑли неÑ, Ñо пÑовеÑÑÐµÑ Object.getPrototypeOf(o).someProp
а еÑли и Ñам неÑ, Ñо иÑÐµÑ Ð² Object.getPrototypeOf(Object.getPrototypeOf(o)).someProp
и Ñак далее.
Ðажно ÑÑÑко понимаÑÑ Ð¿ÑинÑÐ¸Ð¿Ñ ÑабоÑÑ Ð¿ÑоÑоÑипной модели наÑледованиÑ, пÑежде Ñем наÑинаÑÑ Ð¿Ð¸ÑаÑÑ ÑложнÑй код Ñ ÐµÑ Ð¸ÑполÑзованием. ÐÑи напиÑании JavaScript-кода, иÑполÑзÑÑÑего наÑледование, ÑледÑÐµÑ Ð¿Ð¾Ð¼Ð½Ð¸ÑÑ Ð¾ длине ÑепоÑек пÑоÑоÑипов и ÑÑаÑаÑÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð¸Ñ ÐºÐ°Ðº можно более коÑоÑкими во избежание пÑоблем Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. РаÑÑиÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñе пÑоÑоÑÐ¸Ð¿Ñ ÑледÑÐµÑ Ð¸ÑклÑÑиÑелÑно Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð°Ð½Ð¸Ñ ÑовмеÑÑимоÑÑи кода Ñ Ð¾ÑделÑнÑми "дÑевними" ÑеализаÑиÑми JavaScript, - во вÑÐµÑ Ð¿ÑоÑÐ¸Ñ ÑлÑÑаÑÑ ÑÑо Ð¿Ð»Ð¾Ñ Ð°Ñ Ð¿ÑакÑика.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4