ÐвиÑайний ÑинÑакÑÐ¸Ñ {...} дозволÑÑ ÑÑвоÑиÑи ÑÑлÑки один обâÑкÑ. ÐÑоÑе ÑаÑÑо нам поÑÑÑбно ÑÑвоÑиÑи багаÑо одноÑипниÑ
обâÑкÑÑв, ÑакиÑ
Ñк, напÑиклад, коÑиÑÑÑваÑÑ Ñи елеменÑи Ð¼ÐµÐ½Ñ ÑоÑо.
Це можна зÑобиÑи за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа Ñа опеÑаÑоÑа "new".
ФÑнкÑÑÑ-конÑÑÑÑкÑоÑ
Ð¢ÐµÑ Ð½ÑÑно, ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑи â Ñе звиÑÐ°Ð¹Ð½Ñ ÑÑнкÑÑÑ. Ðднак Ñ Ð´Ð²Ñ Ð·Ð°Ð³Ð°Ð»ÑÐ½Ñ Ð´Ð¾Ð¼Ð¾Ð²Ð»ÐµÐ½Ð¾ÑÑÑ:
- ÐмâÑ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа повинно поÑинаÑиÑÑ Ð· Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ Ð»ÑÑеÑи.
- ФÑнкÑÑÑ-конÑÑÑÑкÑоÑи Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑваÑиÑÑ Ð»Ð¸Ñе з опеÑаÑоÑом
"new".
ÐапÑиклад:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Ðжек");
alert(user.name); // Ðжек
alert(user.isAdmin); // false
Ðоли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ Ð· new, вÑдбÑваÑÑÑÑÑ Ð½Ð°ÑÑÑÐ¿Ð½Ñ ÐºÑоки:
- СÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ поÑожнÑй обâÑкÑ, ÑÐºÐ¾Ð¼Ñ Ð¿ÑиÑвоÑÑÑÑÑÑ
this. - ÐиконÑÑÑÑÑÑ ÑÑло ÑÑнкÑÑÑ. ÐазвиÑай воно модиÑÑкÑÑ
this, Ð´Ð¾Ð´Ð°Ñ Ð´Ð¾ нÑого Ð½Ð¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ. - ÐовеÑÑаÑÑÑÑÑ Ð·Ð½Ð°ÑеннÑ
this.
ÐнакÑе кажÑÑи, виклик new User(...) ÑобиÑÑ ÑоÑÑ Ð½Ð° зÑазок:
function User(name) {
// this = {}; (неÑвно)
// Ð´Ð¾Ð´Ð°Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð¾ this
this.name = name;
this.isAdmin = false;
// return this; (неÑвно)
}
ÐÑже, let user = new User("Ðжек") Ð´Ð°Ñ Ñой Ñамий ÑезÑлÑÑаÑ, Ñо:
let user = {
name: "Ðжек",
isAdmin: false
};
ТепеÑ, ÑкÑо ми Ñ
оÑемо ÑÑвоÑиÑи ÑнÑиÑ
коÑиÑÑÑваÑÑв, ми можемо викликаÑи new User("Ðанна"), new User("ÐлÑÑа") ÑоÑо. Така конÑÑÑÑкÑÑÑ Ð·Ð½Ð°Ñно коÑоÑÑа, нÑж викоÑиÑÑÐ°Ð½Ð½Ñ Ð»ÑÑеÑалÑв кожного ÑазÑ, а Ñакож легÑа Ð´Ð»Ñ ÑиÑаннÑ.
Це Ñ Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ñ Ð¼ÐµÑÐ¾Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑв â зÑÑÑне пеÑевикоÑиÑÑÐ°Ð½Ð½Ñ ÐºÐ¾Ð´Ñ Ð·Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв.
Ще Ñаз заÑважимо â ÑеÑ
нÑÑно бÑдÑ-Ñка ÑÑнкÑÑÑ (окÑÑм ÑÑÑÑлковиÑ
ÑÑнкÑÑй, оÑкÑлÑки вони не маÑÑÑ Ð²Ð»Ð°Ñного this) може бÑÑи викоÑиÑÑана Ñк конÑÑÑÑкÑоÑ. Ðона може бÑÑи запÑÑена ÑеÑез new, Ñ Ð±Ñде виконано наведений виÑе алгоÑиÑм. âÐмâÑ Ð· Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ Ð»ÑÑеÑиâ Ñе загалÑна домовленÑÑÑÑ, Ñка Ð´Ð¾Ð¿Ð¾Ð¼Ð°Ð³Ð°Ñ ÑÑÑко зÑозÑмÑÑи, Ñо ÑÑнкÑÑÑ ÑлÑд запÑÑкаÑи з new.
ЯкÑо Ñ Ð½Ð°Ñ Ñ Ð±Ð°Ð³Ð°Ñо ÑÑдкÑв кодÑ, ÑÐºÑ ÑÑвоÑÑÑÑÑ Ñдиний Ñкладний обâÑкÑ, ми можемо обеÑнÑÑи ÑÑ Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑ, Ñка одÑÐ°Ð·Ñ Ð±Ñде викликана, Ñаким Ñином:
// ÑÑвоÑиÑи ÑÑнкÑÑÑ Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ викликаÑи ÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ new
let user = new function() {
this.name = "Ðжон";
this.isAdmin = false;
// ...ÑнÑий код Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐºÐ¾ÑиÑÑÑваÑа
// можливо Ñкладна логÑка Ñа ÑнÑÑÑÑкÑÑÑ
// локалÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ ÑоÑо
};
Цей конÑÑÑÑкÑÐ¾Ñ Ð½Ðµ можна викликаÑи зновÑ, оÑкÑлÑки вÑн нÑде не збеÑÑгаÑÑÑÑÑ, а лиÑе ÑÑвоÑÑÑÑÑÑÑ Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ. ÐÑже, Ñакий пÑийом ÑпÑÑмований на ÑнкапÑÑлÑÑÑÑ ÐºÐ¾Ð´Ñ, Ñкий ÑÑвоÑÑÑ Ñдиний обâÑкÑ, без подалÑÑого повÑоÑного викоÑиÑÑаннÑ.
ÐеÑевÑÑка Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ñ ÑÐµÐ¶Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа: new.target
СинÑакÑÐ¸Ñ Ð· ÑÑого ÑоздÑÐ»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ ÑÑдко, пÑопÑÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾, ÑкÑо наÑÐ°Ð·Ñ Ð²Ð¸ не Ñ Ð¾ÑеÑе занÑÑÑваÑиÑÑ Ð±ÑлÑÑ Ð´ÐµÑалÑно Ñ Ð¼Ð¾Ð²Ñ.
ÐикоÑиÑÑовÑÑÑи ÑпеÑÑалÑÐ½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ new.target вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ, ми можемо пеÑевÑÑиÑи Ñи бÑла ÑÑ ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð½Ð° за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа new Ñи без нÑого.
ЯкÑо ÑÑнкÑÑÑ Ð±Ñла викликана за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ new, Ñо в new.target бÑде Ñама ÑÑнкÑÑÑ, в ÑнÑÐ¾Ð¼Ñ ÑÐ°Ð·Ñ Ð¾ÑÑимаÑмо undefined:
function User() {
alert(new.target);
}
// виклик без "new":
User(); // undefined
// виклик з "new":
new User(); // function User { ... }
Така можливÑÑÑÑ Ð¼Ð¾Ð¶Ðµ бÑÑи викоÑиÑÑана вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ Ð´Ð»Ñ Ñого, Ñоб дÑзнаÑиÑÑ Ñи ÑÑнкÑÑÑ Ð±Ñла викликана за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа new, âÑ ÑÐµÐ¶Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑаâ, Ñи без нÑого, âÑ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ð¼Ñ ÑежимÑâ.
Ðи Ñакож можемо зÑобиÑи, Ñоб обидва виклики, з new Ñа звиÑайний, Ñобили одне й Ñе Ñаме, Ñаким Ñином:
function User(name) {
if (!new.target) { // ÑкÑо ви викликали без опеÑаÑоÑа new
return new User(name); // ...додамо опеÑаÑÐ¾Ñ new за ваÑ
}
this.name = name;
}
let john = User("Ðжон"); // пеÑенапÑавлÑÑ Ð²Ð¸ÐºÐ»Ð¸Ðº до new User
alert(john.name); // Ðжон
Цей пÑдÑ
Ñд ÑÐ½Ð¾Ð´Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ Ð² бÑблÑоÑекаÑ
Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð±ÑлÑÑ Ð³Ð½ÑÑкого ÑинÑакÑиÑÑ, Ñкий дозволив би ÑозÑобникам викликаÑи ÑÑнкÑÑÑ Ñк з опеÑаÑоÑом new, Ñак Ñ Ð±ÐµÐ· нÑого.
ÐÑоÑе викоÑиÑÑÐ°Ð½Ð½Ñ Ñакого пÑдÑ
Ð¾Ð´Ñ ÑкÑÑÐ·Ñ Ð½Ðµ Ñ Ñ
оÑоÑÐ¾Ñ Ð¿ÑакÑикоÑ, ÑÐ¾Ð¼Ñ Ñо вÑдÑÑÑнÑÑÑÑ new ÑобиÑÑ ÐºÐ¾Ð´ Ð¼ÐµÐ½Ñ Ð¾Ñевидним. РопеÑаÑоÑом new ми ÑÑÑ Ð·Ð½Ð°Ñмо, Ñо бÑде ÑÑвоÑено новий обâÑкÑ.
ÐовеÑÐ½ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð· конÑÑÑÑкÑоÑа return
ÐазвиÑай конÑÑÑÑкÑоÑи не маÑÑÑ ÑнÑÑÑÑкÑÑÑ return. ÐÑ
Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ â запиÑаÑи ÑÑе необÑ
Ñдне Ñ this, Ñке авÑомаÑиÑно ÑÑане ÑезÑлÑÑаÑом.
Ðле ÑкÑо Ñ ÑнÑÑÑÑкÑÑÑ return, Ñо заÑÑоÑовÑÑÑÑÑÑ Ð¿ÑоÑÑе пÑавило:
- ЯкÑо
returnвикликаÑÑÑÑÑ Ð· обâÑкÑом, ÑÐ¾Ð´Ñ Ð·Ð°Ð¼ÑÑÑÑthisбÑде повеÑнено Ñей обâÑкÑ. - ЯкÑо
returnвикликаÑÑÑÑÑ Ð· пÑимÑÑивом, пÑимÑÑив ÑгноÑÑÑÑÑÑÑ.
ÐнакÑе кажÑÑи, return з обâÑкÑом повеÑÑÐ°Ñ Ñей обâÑкÑ, Ñ Ð²ÑÑÑ
ÑнÑиÑ
випадкаÑ
повеÑÑаÑÑÑÑÑ this.
У наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ return пеÑезапиÑÑÑ this, повеÑÑаÑÑи обâÑкÑ:
function BigUser() {
this.name = "Ðжон";
return { name: "ÒодзÑлла" }; // <-- повеÑÑÐ°Ñ Ñей обâÑкÑ
}
alert( new BigUser().name ); // ÒодзÑлла, оÑÑимали Ñей обâÑкÑ
РоÑÑ Ð¿Ñиклад з поÑожнÑм return (або ми можемо ÑозмÑÑÑиÑи пÑимÑÑив пÑÑÐ»Ñ Ð½Ñого, не Ð¼Ð°Ñ Ð·Ð½Ð°ÑеннÑ):
function SmallUser() {
this.name = "Ðжон";
return; // <-- повеÑÑÐ°Ñ this
}
alert( new SmallUser().name ); // Ðжон
ÐазвиÑай конÑÑÑÑкÑоÑи не маÑÑÑ ÑнÑÑÑÑкÑÑÑ return. ТÑÑ Ð¼Ð¸ згадÑÑмо оÑÐ¾Ð±Ð»Ð¸Ð²Ñ Ð¿Ð¾Ð²ÐµÐ´ÑÐ½ÐºÑ Ð· повеÑненнÑми обâÑкÑÑв, головним Ñином, Ð´Ð»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ñи вивÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð²Ð¸.
Ðо ÑеÑÑ, ми можемо опÑÑÑиÑи дÑжки пÑÑÐ»Ñ new, ÑкÑо виклик конÑÑÑÑкÑоÑа вÑдбÑваÑÑÑÑÑ Ð±ÐµÐ· аÑгÑменÑÑв:
let user = new User; // <-- Ð½ÐµÐ¼Ð°Ñ Ð´Ñжок
// Ñе Ñаме, Ñо
let user = new User();
ÐÑопÑÑк дÑжок не Ñ Ð³Ð°ÑÐ½Ð¾Ñ Ð¿ÑакÑикоÑ, Ñа ÑпеÑиÑÑкаÑÑÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ Ñакий ÑинÑакÑиÑ.
СÑвоÑÐµÐ½Ð½Ñ Ð¼ÐµÑодÑв Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ
ÐикоÑиÑÑÐ°Ð½Ð½Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑв Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв Ð´Ð°Ñ Ð²ÐµÐ»Ð¸ÐºÑ Ð³Ð½ÑÑкÑÑÑÑ. ÐонÑÑÑÑкÑÐ¾Ñ Ð¼Ð¾Ð¶Ðµ маÑи паÑамеÑÑи, ÑÐºÑ Ð²Ð¸Ð·Ð½Ð°ÑаÑÑÑ, Ñк побÑдÑваÑи обâÑÐºÑ Ñ Ñо в нÑого помÑÑÑиÑи.
ÐвиÑайно, ми можемо додаÑи до this не лиÑе влаÑÑивоÑÑÑ, але й меÑоди.
У Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ñе пÑикладÑ, new User(name) ÑÑвоÑÑÑ Ð¾Ð±âÑÐºÑ Ñз заданим name Ñа меÑодом sayHi:
function User(name) {
this.name = name;
this.sayHi = function() {
alert( "ÐÐ¾Ñ ÑмâÑ: " + this.name );
};
}
let john = new User("Ðжон");
john.sayHi(); // ÐÐ¾Ñ ÑмâÑ: Ðжон
/*
john = {
name: "Ðжон",
sayHi: function() { ... }
}
*/
ÐÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑÐºÐ»Ð°Ð´Ð½Ð¸Ñ Ð¾Ð±âÑкÑÑв ÑÑнÑÑ Ð±ÑлÑÑ Ð¿ÑоÑÑнÑÑий ÑинÑакÑиÑ, клаÑи, пÑо Ñкий ми поговоÑимо пÑзнÑÑе.
ÐÑдÑÑмки
- ФÑнкÑÑÑ-конÑÑÑÑкÑоÑи або, коÑоÑко, конÑÑÑÑкÑоÑи, Ñ Ð·Ð²Ð¸Ñайними ÑÑнкÑÑÑми, але ÑÑнÑÑ Ð·Ð°Ð³Ð°Ð»Ñна домовленÑÑÑÑ ÑмâÑ ÑÐ°ÐºÐ¾Ñ ÑÑнкÑÑÑ Ð¿Ð¾ÑинаÑи з Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ Ð»ÑÑеÑи.
- ÐонÑÑÑÑкÑоÑи Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑиÑÑ ÑÑлÑки з викоÑиÑÑаннÑм опеÑаÑоÑа
new. Такий виклик пеÑедбаÑÐ°Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑожнÑогоthisна поÑаÑÐºÑ Ñа повеÑÐ½ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð¾Ð³Ð¾ Ñ ÐºÑнÑÑ.
Ðи можемо викоÑиÑÑовÑваÑи конÑÑÑÑкÑоÑи Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑиÑÐ»ÐµÐ½Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑÐ±Ð½Ð¸Ñ Ð¾Ð±âÑкÑÑв.
JavaScript Ð½Ð°Ð´Ð°Ñ ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑи Ð´Ð»Ñ Ð±Ð°Ð³Ð°ÑÑоÑ
вбÑдованиÑ
обâÑкÑÑв мови: напÑиклад, Date, Set Ñа ÑнÑиÑ
, ÑÐºÑ Ð¼Ð¸ планÑÑмо вивÑаÑи далÑ.
У ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¼Ð¸ ÑозглÑдаÑмо лиÑе оÑнови обâÑкÑÑв Ñа конÑÑÑÑкÑоÑÑв. Ðони Ñ Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¸Ð¼Ð¸ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑÑого вивÑÐµÐ½Ð½Ñ ÑипÑв Ð´Ð°Ð½Ð¸Ñ Ñа ÑÑнкÑÑй Ñ Ð½Ð°ÑÑÑÐ¿Ð½Ð¸Ñ ÑоздÑÐ»Ð°Ñ .
ÐÑÑÐ»Ñ Ñого, Ñк ми Ñе вивÑимо, ми повеÑнемоÑÑ Ð´Ð¾ обâÑкÑÑв Ð´Ð»Ñ Ð±ÑлÑÑ Ð´ÐµÑалÑного ÑÑ Ð²Ð¸Ð²ÑÐµÐ½Ð½Ñ Ñ ÑоздÑÐ»Ð°Ñ ÐÑоÑоÑипи, наÑлÑдÑÐ²Ð°Ð½Ð½Ñ Ñа ÐлаÑи.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)