РпÑогÑаммиÑовании Ð¼Ñ ÑаÑÑо Ñ Ð¾Ñим взÑÑÑ ÑÑо-Ñо и ÑаÑÑиÑиÑÑ.
ÐапÑимеÑ, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¾Ð±ÑÐµÐºÑ user Ñо Ñвоими ÑвойÑÑвами и меÑодами, и Ð¼Ñ Ñ
оÑим ÑоздаÑÑ Ð¾Ð±ÑекÑÑ admin и guest как его Ñлегка изменÑннÑе ваÑианÑÑ. ÐÑ Ñ
оÑели Ð±Ñ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ Ñо, ÑÑо еÑÑÑ Ñ Ð¾Ð±ÑекÑа user, не копиÑоваÑÑ/пеÑеопÑеделÑÑÑ ÐµÐ³Ð¾ меÑодÑ, а пÑоÑÑо ÑоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ Ð½Ð° его оÑнове.
ÐÑоÑоÑипное наÑледование â ÑÑо возможноÑÑÑ ÑзÑка, коÑоÑÐ°Ñ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð² ÑÑом.
[[Prototype]]
Ð JavaScript обÑекÑÑ Ð¸Ð¼ÐµÑÑ ÑпеÑиалÑное ÑкÑÑÑое ÑвойÑÑво [[Prototype]] (Ñак оно названо в ÑпеÑиÑикаÑии), коÑоÑое либо Ñавно null, либо ÑÑÑлаеÑÑÑ Ð½Ð° дÑÑгой обÑекÑ. ÐÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð½Ð°Ð·ÑваеÑÑÑ Â«Ð¿ÑоÑоÑип»:
ÐÑоÑоÑип даÑÑ Ð½Ð°Ð¼ немного «магии». Ðогда Ð¼Ñ Ñ
оÑим пÑоÑиÑаÑÑ ÑвойÑÑво из object, а оно оÑÑÑÑÑÑвÑеÑ, JavaScript авÑомаÑиÑеÑки беÑÑÑ ÐµÐ³Ð¾ из пÑоÑоÑипа. РпÑогÑаммиÑовании Ñакой меÑ
анизм назÑваеÑÑÑ Â«Ð¿ÑоÑоÑипнÑм наÑледованием». Ðногие инÑеÑеÑнÑе возможноÑÑи ÑзÑка и ÑеÑ
ники пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑновÑваÑÑÑÑ Ð½Ð° нÑм.
СвойÑÑво [[Prototype]] ÑвлÑеÑÑÑ Ð²Ð½ÑÑÑенним и ÑкÑÑÑÑм, но еÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑпоÑобов задаÑÑ ÐµÐ³Ð¾.
Ðдним из ниÑ
ÑвлÑеÑÑÑ Ð¸ÑполÑзование __proto__, напÑÐ¸Ð¼ÐµÑ Ñак:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal;
ÐÑли Ð¼Ñ Ð¸Ñем ÑвойÑÑво в rabbit, а оно оÑÑÑÑÑÑвÑеÑ, JavaScript авÑомаÑиÑеÑки беÑÑÑ ÐµÐ³Ð¾ из animal.
ÐапÑимеÑ:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // (*)
// ÑепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ найÑи оба ÑвойÑÑва в rabbit:
alert( rabbit.eats ); // true (**)
alert( rabbit.jumps ); // true
ÐдеÑÑ ÑÑÑока (*) ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ animal как пÑоÑоÑип Ð´Ð»Ñ rabbit.
ÐаÑем, когда alert пÑÑаеÑÑÑ Ð¿ÑоÑиÑаÑÑ ÑвойÑÑво rabbit.eats (**), его Ð½ÐµÑ Ð² rabbit, поÑÑÐ¾Ð¼Ñ JavaScript ÑледÑÐµÑ Ð¿Ð¾ ÑÑÑлке [[Prototype]] и наÑ
Ð¾Ð´Ð¸Ñ ÐµÐ³Ð¾ в animal (ÑмоÑÑиÑе ÑÐ½Ð¸Ð·Ñ Ð²Ð²ÐµÑÑ
):
ÐдеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑказаÑÑ, ÑÑо «animal ÑвлÑеÑÑÑ Ð¿ÑоÑоÑипом rabbit» или «rabbit пÑоÑоÑипно наÑледÑÐµÑ Ð¾Ñ animal».
Так ÑÑо еÑли Ñ animal много полезнÑÑ
ÑвойÑÑв и меÑодов, Ñо они авÑомаÑиÑеÑки ÑÑановÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми Ñ rabbit. Такие ÑвойÑÑва назÑваÑÑÑÑ Â«ÑнаÑледованнÑми».
ÐÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼ÐµÑод в animal, он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзван на rabbit:
let animal = {
eats: true,
walk() {
alert("Animal walk");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
// walk взÑÑ Ð¸Ð· пÑоÑоÑипа
rabbit.walk(); // Animal walk
ÐеÑод авÑомаÑиÑеÑки беÑÑÑÑÑ Ð¸Ð· пÑоÑоÑипа:
ЦепоÑка пÑоÑоÑипов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð»Ð¸Ð½Ð½ÐµÐµ:
let animal = {
eats: true,
walk() {
alert("Animal walk");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
let longEar = {
earLength: 10,
__proto__: rabbit
};
// walk взÑÑ Ð¸Ð· ÑепоÑки пÑоÑоÑипов
longEar.walk(); // Animal walk
alert(longEar.jumps); // true (из rabbit)
ТепеÑÑ, еÑли Ð¼Ñ Ð¿ÑоÑÑÑм ÑÑо-нибÑÐ´Ñ Ð¸Ð· longEar, и оно бÑÐ´ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ, JavaScript бÑÐ´ÐµÑ Ð¸ÑкаÑÑ ÐµÐ³Ð¾ в rabbit, а заÑем в animal.
ÐÑÑÑ ÑолÑко два огÑаниÑениÑ:
- СÑÑлки не могÑÑ Ð¸Ð´Ñи по кÑÑгÑ. JavaScript вÑдаÑÑ Ð¾ÑибкÑ, еÑли Ð¼Ñ Ð¿Ð¾Ð¿ÑÑаемÑÑ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ
__proto__по кÑÑгÑ. - ÐнаÑение
__proto__Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑекÑом илиnull. ÐÑÑгие ÑÐ¸Ð¿Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ.
ÐÑо вполне оÑевидно, но вÑÑ Ð¶Ðµ: Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один [[Prototype]]. ÐбÑÐµÐºÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑледоваÑÑÑÑ Ð¾Ñ Ð´Ð²ÑÑ
дÑÑгиÑ
обÑекÑов.
__proto__ â иÑÑоÑиÑеÑки обÑÑловленнÑй геÑÑеÑ/ÑеÑÑÐµÑ Ð´Ð»Ñ [[Prototype]]ÐÑо ÑаÑпÑоÑÑÑанÑÐ½Ð½Ð°Ñ Ð¾Ñибка наÑинаÑÑÐ¸Ñ ÑазÑабоÑÑиков â не знаÑÑ ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑими двÑÐ¼Ñ Ð¿Ð¾Ð½ÑÑиÑми.
ÐбÑаÑиÑе внимание, ÑÑо __proto__ â не Ñо же Ñамое, ÑÑо внÑÑÑеннее ÑвойÑÑво [[Prototype]]. ÐÑо геÑÑеÑ/ÑеÑÑÐµÑ Ð´Ð»Ñ [[Prototype]]. Ðозже Ð¼Ñ Ñвидим ÑиÑÑаÑии, когда ÑÑо Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, а пока давайÑе пÑоÑÑо бÑдем имеÑÑ ÑÑо в видÑ, поÑколÑÐºÑ Ð¼Ñ ÑÑÑоим наÑе понимание ÑзÑка JavaScript.
СвойÑÑво __proto__ немного ÑÑÑаÑело, оно ÑÑÑеÑÑвÑÐµÑ Ð¿Ð¾ иÑÑоÑиÑеÑким пÑиÑинам. СовÑеменнÑй JavaScript пÑедполагаеÑ, ÑÑо Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ ÑÑнкÑии Object.getPrototypeOf/Object.setPrototypeOf вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑаÑÑ/ÑÑÑанавливаÑÑ Ð¿ÑоÑоÑип. ÐÑ Ñакже ÑаÑÑмоÑÑим ÑÑи ÑÑнкÑии позже.
Ðо ÑпеÑиÑикаÑии __proto__ должен поддеÑживаÑÑÑÑ ÑолÑко бÑаÑзеÑами, но по ÑакÑÑ Ð²Ñе ÑÑедÑ, вклÑÑÐ°Ñ ÑеÑвеÑнÑÑ, поддеÑживаÑÑ ÐµÐ³Ð¾. Так ÑÑо Ð¼Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ безопаÑно его иÑполÑзÑем.
Ðалее Ð¼Ñ Ð±Ñдем в пÑимеÑаÑ
иÑполÑзоваÑÑ __proto__, Ñак как ÑÑо ÑамÑй коÑоÑкий и инÑÑиÑивно понÑÑнÑй ÑпоÑоб ÑÑÑановки и ÑÑÐµÐ½Ð¸Ñ Ð¿ÑоÑоÑипа.
ÐпеÑаÑÐ¸Ñ Ð·Ð°Ð¿Ð¸Ñи не иÑполÑзÑÐµÑ Ð¿ÑоÑоÑип
ÐÑоÑоÑип иÑполÑзÑеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ ÑвойÑÑв.
ÐпеÑаÑии запиÑи/ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑабоÑаÑÑ Ð½Ð°Ð¿ÑÑмÑÑ Ñ Ð¾Ð±ÑекÑом.
РпÑиведÑнном ниже пÑимеÑе Ð¼Ñ Ð¿ÑиÑваиваем rabbit ÑобÑÑвеннÑй меÑод walk:
let animal = {
eats: true,
walk() {
/* ÑÑÐ¾Ñ Ð¼ÐµÑод не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² rabbit */
}
};
let rabbit = {
__proto__: animal
};
rabbit.walk = function() {
alert("Rabbit! Bounce-bounce!");
};
rabbit.walk(); // Rabbit! Bounce-bounce!
ТепеÑÑ Ð²Ñзов rabbit.walk() наÑ
Ð¾Ð´Ð¸Ñ Ð¼ÐµÑод непоÑÑедÑÑвенно в обÑекÑе и вÑполнÑÐµÑ ÐµÐ³Ð¾, не иÑполÑзÑÑ Ð¿ÑоÑоÑип:
СвойÑÑва-акÑеÑÑоÑÑ â иÑклÑÑение, Ñак как запиÑÑ Ð² него обÑабаÑÑваеÑÑÑ ÑÑнкÑией-ÑеÑÑеÑом. То еÑÑÑ ÑÑо ÑакÑиÑеÑки вÑзов ÑÑнкÑии.
Ðо ÑÑой пÑиÑине admin.fullName ÑабоÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑно в пÑиведÑнном ниже коде:
let user = {
name: "John",
surname: "Smith",
set fullName(value) {
[this.name, this.surname] = value.split(" ");
},
get fullName() {
return `${this.name} ${this.surname}`;
}
};
let admin = {
__proto__: user,
isAdmin: true
};
alert(admin.fullName); // John Smith (*)
// ÑÑабаÑÑÐ²Ð°ÐµÑ ÑеÑÑеÑ!
admin.fullName = "Alice Cooper"; // (**)
alert(admin.name); // Alice
alert(admin.surname); // Cooper
ÐдеÑÑ Ð² ÑÑÑоке (*) ÑвойÑÑво admin.fullName Ð¸Ð¼ÐµÐµÑ Ð³ÐµÑÑÐµÑ Ð² пÑоÑоÑипе user, поÑÑÐ¾Ð¼Ñ Ð²ÑзÑваеÑÑÑ Ð¾Ð½. Ð ÑÑÑоке (**) ÑвойÑÑво Ñакже Ð¸Ð¼ÐµÐµÑ ÑеÑÑÐµÑ Ð² пÑоÑоÑипе, коÑоÑÑй и бÑÐ´ÐµÑ Ð²Ñзван.
ÐнаÑение «this»
РпÑиведÑнном вÑÑе пÑимеÑе Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¸Ð½ÑеÑеÑнÑй вопÑоÑ: каково знаÑение this внÑÑÑи set fullName(value)? ÐÑда запиÑÐ°Ð½Ñ ÑвойÑÑва this.name и this.surname: в user или в admin?
ÐÑÐ²ÐµÑ Ð¿ÑоÑÑ: пÑоÑоÑÐ¸Ð¿Ñ Ð½Ð¸ÐºÐ°Ðº не влиÑÑÑ Ð½Ð° this.
Ðеважно, где наÑ
одиÑÑÑ Ð¼ÐµÑод: в обÑекÑе или его пÑоÑоÑипе. ÐÑи вÑзове меÑода this â вÑегда обÑÐµÐºÑ Ð¿ÐµÑед ÑоÑкой.
Таким обÑазом, вÑзов ÑеÑÑеÑа admin.fullName= в каÑеÑÑве this иÑполÑзÑÐµÑ admin, а не user.
ÐÑо на Ñамом деле оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð´ÐµÑалÑ, поÑÐ¾Ð¼Ñ ÑÑо Ñ Ð½Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑой обÑÐµÐºÑ Ñо множеÑÑвом меÑодов, Ð¾Ñ ÐºÐ¾ÑоÑого можно наÑледоваÑÑ. ÐаÑем наÑледÑÑÑие обÑекÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑ ÐµÐ³Ð¾ меÑодÑ, но они бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑÐ²Ð¾Ñ ÑоÑÑоÑние, а не ÑоÑÑоÑние обÑекÑа-ÑодиÑелÑ.
ÐапÑимеÑ, здеÑÑ animal пÑедÑÑавлÑÐµÑ Ñобой «Ñ
ÑанилиÑе меÑодов», и rabbit иÑполÑзÑÐµÑ ÐµÐ³Ð¾.
ÐÑзов rabbit.sleep() ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ this.isSleeping Ð´Ð»Ñ Ð¾Ð±ÑекÑа rabbit:
// меÑÐ¾Ð´Ñ animal
let animal = {
walk() {
if (!this.isSleeping) {
alert(`I walk`);
}
},
sleep() {
this.isSleeping = true;
}
};
let rabbit = {
name: "White Rabbit",
__proto__: animal
};
// модиÑиÑиÑÑÐµÑ rabbit.isSleeping
rabbit.sleep();
alert(rabbit.isSleeping); // true
alert(animal.isSleeping); // undefined (Ð½ÐµÑ Ñакого ÑвойÑÑва в пÑоÑоÑипе)
ÐаÑÑинка Ñ ÑезÑлÑÑаÑом:
ÐÑли Ð±Ñ Ñ Ð½Ð°Ñ Ð±Ñли дÑÑгие обÑекÑÑ, Ñакие как bird, snake и Ñ.д., ÑнаÑледованнÑе Ð¾Ñ animal, они Ñакже полÑÑили Ð±Ñ Ð´Ð¾ÑÑÑп к меÑодам animal. Ðо this пÑи вÑзове каждого меÑода бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð±ÑекÑÑ (пеÑед ÑоÑкой), на коÑоÑом пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð²Ñзов, а не animal. ÐоÑÑомÑ, когда Ð¼Ñ Ð·Ð°Ð¿Ð¸ÑÑваем даннÑе в this, они ÑоÑ
ÑанÑÑÑÑÑ Ð² ÑÑиÑ
обÑекÑаÑ
.
Ð ÑезÑлÑÑаÑе меÑÐ¾Ð´Ñ ÑвлÑÑÑÑÑ Ð¾Ð±Ñими, а ÑоÑÑоÑние обÑекÑа â неÑ.
Цикл forâ¦in
Цикл for..in пÑоÑ
Ð¾Ð´Ð¸Ñ Ð½Ðµ ÑолÑко по ÑобÑÑвеннÑм, но и по ÑнаÑледованнÑм ÑвойÑÑвам обÑекÑа.
ÐапÑимеÑ:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
// Object.keys возвÑаÑÐ°ÐµÑ ÑолÑко ÑобÑÑвеннÑе клÑÑи
alert(Object.keys(rabbit)); // jumps
// for..in пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¸ по Ñвоим, и по ÑнаÑледованнÑм клÑÑам
for(let prop in rabbit) alert(prop); // jumps, заÑем eats
ÐÑли ÑнаÑледованнÑе ÑвойÑÑва нам не нÑжнÑ, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ оÑÑилÑÑÑоваÑÑ Ð¸Ñ
пÑи помоÑи вÑÑÑоенного меÑода obj.hasOwnProperty(key): он возвÑаÑÐ°ÐµÑ true, еÑли Ñ obj еÑÑÑ ÑобÑÑвенное, не ÑнаÑледованное, ÑвойÑÑво Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ key.
ÐÑÐ¸Ð¼ÐµÑ Ñакой ÑилÑÑÑаÑии:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
for(let prop in rabbit) {
let isOwn = rabbit.hasOwnProperty(prop);
if (isOwn) {
alert(`Our: ${prop}`); // Our: jumps
} else {
alert(`Inherited: ${prop}`); // Inherited: eats
}
}
Ð ÑÑом пÑимеÑе ÑепоÑка наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑглÑÐ´Ð¸Ñ Ñак: rabbit наÑледÑÐµÑ Ð¾Ñ animal, коÑоÑÑй наÑледÑÐµÑ Ð¾Ñ Object.prototype (Ñак как animal â лиÑеÑалÑнÑй обÑÐµÐºÑ {...}, Ñо ÑÑо по ÑмолÑаниÑ), а заÑем null на Ñамом веÑÑ
Ñ:
ÐамеÑим еÑÑ Ð¾Ð´Ð½Ñ Ð´ÐµÑалÑ. ÐÑкÑда взÑлÑÑ Ð¼ÐµÑод rabbit.hasOwnProperty? ÐÑ ÐµÐ³Ð¾ Ñвно не опÑеделÑли. ÐÑли поÑмоÑÑеÑÑ Ð½Ð° ÑепоÑÐºÑ Ð¿ÑоÑоÑипов, Ñо видно, ÑÑо он беÑÑÑÑÑ Ð¸Ð· Object.prototype.hasOwnProperty. То еÑÑÑ Ð¾Ð½ ÑнаÑледован.
â¦Ðо поÑÐµÐ¼Ñ hasOwnProperty не поÑвлÑеÑÑÑ Ð² Ñикле for..in в оÑлиÑие Ð¾Ñ eats и jumps? Ðн Ð²ÐµÐ´Ñ Ð¿ÐµÑеÑиÑлÑÐµÑ Ð²Ñе ÑнаÑледованнÑе ÑвойÑÑва.
ÐÑÐ²ÐµÑ Ð¿ÑоÑÑой: оно не пеÑеÑиÑлимо. То еÑÑÑ Ñ Ð½ÐµÐ³Ð¾ внÑÑÑенний Ñлаг enumerable ÑÑÐ¾Ð¸Ñ false, как и Ñ Ð´ÑÑгиÑ
ÑвойÑÑв Object.prototype. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ и не поÑвлÑеÑÑÑ Ð² Ñикле.
ÐоÑÑи вÑе оÑÑалÑнÑе меÑодÑ, полÑÑаÑÑие клÑÑи/знаÑениÑ, Ñакие как Object.keys, Object.values и дÑÑгие â игноÑиÑÑÑÑ ÑнаÑледованнÑе ÑвойÑÑва.
Ðни ÑÑиÑÑваÑÑ ÑолÑко ÑвойÑÑва Ñамого обÑекÑа, не его пÑоÑоÑипа.
ÐÑого
- Ð JavaScript вÑе обÑекÑÑ Ð¸Ð¼ÐµÑÑ ÑкÑÑÑое ÑвойÑÑво
[[Prototype]], коÑоÑое ÑвлÑеÑÑÑ Ð»Ð¸Ð±Ð¾ дÑÑгим обÑекÑом, либоnull. - ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ
obj.__proto__Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к Ð½ÐµÐ¼Ñ (иÑÑоÑиÑеÑки обÑÑловленнÑй геÑÑеÑ/ÑеÑÑеÑ, еÑÑÑ Ð´ÑÑгие ÑпоÑобÑ, коÑоÑÑе ÑкоÑо бÑдÑÑ ÑаÑÑмоÑÑенÑ). - ÐбÑекÑ, на коÑоÑÑй ÑÑÑлаеÑÑÑ
[[Prototype]], назÑваеÑÑÑ Â«Ð¿ÑоÑоÑипом». - ÐÑли Ð¼Ñ Ñ
оÑим пÑоÑиÑаÑÑ ÑвойÑÑво
objили вÑзваÑÑ Ð¼ÐµÑод, коÑоÑого не ÑÑÑеÑÑвÑÐµÑ Ñobj, Ñогда JavaScript попÑÑаеÑÑÑ Ð½Ð°Ð¹Ñи его в пÑоÑоÑипе. - ÐпеÑаÑии запиÑи/ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑабоÑаÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ Ð¾Ð±ÑекÑом, они не иÑполÑзÑÑÑ Ð¿ÑоÑоÑип (еÑли ÑÑо обÑÑное ÑвойÑÑво, а не ÑеÑÑеÑ).
- ÐÑли Ð¼Ñ Ð²ÑзÑваем
obj.method(), а меÑод пÑи ÑÑом взÑÑ Ð¸Ð· пÑоÑоÑипа, ÑоthisвÑÑ Ñавно ÑÑÑлаеÑÑÑ Ð½Ð°obj. Таким обÑазом, меÑÐ¾Ð´Ñ Ð²Ñегда ÑабоÑаÑÑ Ñ ÑекÑÑим обÑекÑом, даже еÑли они наÑледÑÑÑÑÑ. - Цикл
for..inпеÑебиÑÐ°ÐµÑ ÐºÐ°Ðº Ñвои, Ñак и ÑнаÑледованнÑе ÑвойÑÑва. ÐÑÑалÑнÑе меÑÐ¾Ð´Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей/знаÑений ÑабоÑаÑÑ ÑолÑко Ñ ÑобÑÑвеннÑми ÑвойÑÑвами обÑекÑа.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)