ÐбÑÑнÑй ÑинÑакÑÐ¸Ñ {...} позволÑÐµÑ ÑоздаÑÑ ÑолÑко один обÑекÑ. Ðо заÑаÑÑÑÑ Ð½Ð°Ð¼ нÑжно ÑоздаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво поÑ
ожиÑ
, одноÑипнÑÑ
обÑекÑов, ÑакиÑ
как полÑзоваÑели, ÑлеменÑÑ Ð¼ÐµÐ½Ñ Ð¸ Ñак далее.
ÐÑо можно ÑделаÑÑ Ð¿Ñи помоÑи ÑÑнкÑии-конÑÑÑÑкÑоÑа и опеÑаÑоÑа "new".
ФÑнкÑиÑ-конÑÑÑÑкÑоÑ
ФÑнкÑии-конÑÑÑÑкÑоÑÑ ÑÐµÑ Ð½Ð¸ÑеÑки ÑвлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми ÑÑнкÑиÑми. Ðо еÑÑÑ Ð´Ð²Ð° ÑоглаÑениÑ:
- ÐÐ¼Ñ ÑÑнкÑии-конÑÑÑÑкÑоÑа должно наÑинаÑÑÑÑ Ñ Ð±Ð¾Ð»ÑÑой бÑквÑ.
- ФÑнкÑиÑ-конÑÑÑÑкÑÐ¾Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑполнÑÑÑÑÑ ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа
"new".
ÐапÑимеÑ:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false
Ðогда ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ ÐºÐ°Ðº new User(...), пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑледÑÑÑее:
- СоздаÑÑÑÑ Ð½Ð¾Ð²Ñй пÑÑÑой обÑекÑ, и он пÑиÑваиваеÑÑÑ
this. - ÐÑполнÑеÑÑÑ Ñело ÑÑнкÑии. ÐбÑÑно оно модиÑиÑиÑÑеÑ
this, добавлÑÑ ÑÑда новÑе ÑвойÑÑва. - ÐозвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение
this.
ÐÑÑгими Ñловами, new User(...) Ð´ÐµÐ»Ð°ÐµÑ ÑÑо-Ñо вÑоде:
function User(name) {
// this = {}; (неÑвно)
// добавлÑÐµÑ ÑвойÑÑва к this
this.name = name;
this.isAdmin = false;
// return this; (неÑвно)
}
Таким обÑазом, let user = new User("Jack") возвÑаÑÐ°ÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, ÑÑо и:
let user = {
name: "Jack",
isAdmin: false
};
ТепеÑÑ, еÑли нам бÑÐ´ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимо ÑоздаÑÑ Ð´ÑÑгиÑ
полÑзоваÑелей, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑоÑÑо вÑзваÑÑ new User("Ann"), new User("Alice") и Ñак далее. ÐÐ°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ Ð³Ð¾Ñаздо Ñдобнее и ÑиÑабелÑнее, Ñем многокÑаÑное Ñоздание лиÑеÑала обÑекÑа.
ÐÑо и ÑвлÑеÑÑÑ Ð¾Ñновной ÑелÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑов â ÑеализоваÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾ÑипнÑÑ Ð¾Ð±ÑекÑов.
ÐавайÑе еÑÑ Ñаз оÑмеÑим â ÑеÑ
ниÑеÑки лÑÐ±Ð°Ñ ÑÑнкÑÐ¸Ñ (кÑоме ÑÑÑелоÑнÑÑ
ÑÑнкÑий, поÑколÑÐºÑ Ñ Ð½Ð¸Ñ
Ð½ÐµÑ this) Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве конÑÑÑÑкÑоÑа. Ðго можно запÑÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ new, и он вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð²ÑÑе ÑказаннÑй алгоÑиÑм. ÐодобнÑе ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°ÑинаÑÑÑÑ Ñ Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ бÑÐºÐ²Ñ â ÑÑо обÑепÑинÑÑое ÑоглаÑение, ÑÑÐ¾Ð±Ñ Ð±Ñло ÑÑно, ÑÑо ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑзÑваÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Â«new».
ÐÑли в наÑем коде пÑиÑÑÑÑÑвÑÐµÑ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво ÑÑÑок, ÑоздаÑÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ ÑложнÑй обÑекÑ, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ обеÑнÑÑÑ Ð¸Ñ Ð² ÑÑнкÑиÑ-конÑÑÑÑкÑоÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ вÑзвана, Ð²Ð¾Ñ Ñак:
// ÑоздаÑм ÑÑнкÑÐ¸Ñ Ð¸ ÑÑÐ°Ð·Ñ Ð¶Ðµ вÑзÑваем ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...дÑÑгой код Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
// возможна лÑÐ±Ð°Ñ ÑÐ»Ð¾Ð¶Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ° и инÑÑÑÑкÑии
// локалÑнÑе пеÑеменнÑе и Ñак далее
};
Такой конÑÑÑÑкÑÐ¾Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзван Ñнова, Ñак как он нигде не ÑÐ¾Ñ ÑанÑеÑÑÑ, пÑоÑÑо ÑоздаÑÑÑÑ Ð¸ ÑÑÑ Ð¶Ðµ вÑзÑваеÑÑÑ. Таким обÑазом, ÑÑÐ¾Ñ ÑÑÑк напÑавлен на инкапÑÑлÑÑÐ¸Ñ ÐºÐ¾Ð´Ð°, коÑоÑÑй ÑоздаÑÑ Ð¾ÑделÑнÑй обÑекÑ, без возможноÑÑи повÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² бÑдÑÑем.
ÐÑовеÑка на вÑзов в Ñежиме конÑÑÑÑкÑоÑа: new.target
СинÑакÑÐ¸Ñ Ð¸Ð· ÑÑого Ñаздела иÑполÑзÑеÑÑÑ ÐºÑайне Ñедко. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑÑ ÐµÐ³Ð¾, еÑли не Ñ Ð¾ÑиÑе ÑглÑблÑÑÑÑÑ Ð² деÑали ÑзÑка.
ÐÑполÑзÑÑ ÑпеÑиалÑное ÑвойÑÑво new.target внÑÑÑи ÑÑнкÑии, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑовеÑиÑÑ, вÑзвана ли ÑÑнкÑÐ¸Ñ Ð¿Ñи помоÑи опеÑаÑоÑа new или без него.
Ð ÑлÑÑае обÑÑного вÑзова ÑÑнкÑии new.target бÑÐ´ÐµÑ undefined. ÐÑли же она бÑла вÑзвана пÑи помоÑи new, new.target бÑÐ´ÐµÑ Ñавен Ñамой ÑÑнкÑии.
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("John"); // пеÑеадÑеÑовÑÐ²Ð°ÐµÑ Ð²Ñзов на new User
alert(john.name); // John
Такой подÑ
од иногда иÑполÑзÑеÑÑÑ Ð² библиоÑекаÑ
, ÑÑÐ¾Ð±Ñ ÑделаÑÑ ÑинÑакÑÐ¸Ñ Ð±Ð¾Ð»ÐµÐµ гибким. ЧÑÐ¾Ð±Ñ Ð»Ñди могли вÑзÑваÑÑ ÑÑнкÑÐ¸Ñ Ñ new и без него, и она вÑе еÑÑ Ð¼Ð¾Ð³Ð»Ð° ÑабоÑаÑÑ.
ÐпÑоÑем, веÑоÑÑно, ÑÑо не оÑÐµÐ½Ñ Ñ
оÑоÑÐ°Ñ Ð¿ÑакÑика иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑÑÑк везде, Ñак как оÑÑÑÑÑÑвие new Ð¼Ð¾Ð¶ÐµÑ Ð²Ð²ÐµÑÑи ÑазÑабоÑÑика в заблÑждение. С new Ð¼Ñ ÑоÑно знаем, ÑÑо ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй обÑекÑ.
ÐозвÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð· конÑÑÑÑкÑоÑа, return
ÐбÑÑно конÑÑÑÑкÑоÑÑ Ð½Ðµ имеÑÑ Ð¾Ð¿ÐµÑаÑоÑа return. ÐÑ
задаÑа â запиÑаÑÑ Ð²Ñе необÑ
одимое в this, и ÑÑо авÑомаÑиÑеÑки ÑÑановиÑÑÑ ÑезÑлÑÑаÑом.
Ðо еÑли return вÑÑ Ð¶Ðµ еÑÑÑ, Ñо пÑименÑеÑÑÑ Ð¿ÑоÑÑое пÑавило:
- ÐÑи вÑзове
returnÑ Ð¾Ð±ÑекÑом, вмеÑÑоthisвеÑнÑÑÑÑ Ð¾Ð±ÑекÑ. - ÐÑи вÑзове
returnÑ Ð¿ÑимиÑивнÑм знаÑением, оно пÑоигноÑиÑÑеÑÑÑ.
ÐÑÑгими Ñловами, return Ñ Ð¾Ð±ÑекÑом возвÑаÑÐ°ÐµÑ ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ, во вÑеÑ
оÑÑалÑнÑÑ
ÑлÑÑаÑÑ
возвÑаÑаеÑÑÑ this.
РпÑимеÑÑ, здеÑÑ return замеÑÐ°ÐµÑ this, возвÑаÑÐ°Ñ Ð¾Ð±ÑекÑ:
function BigUser() {
this.name = "John";
return { name: "Godzilla" }; // <-- возвÑаÑÐ°ÐµÑ ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ
}
alert( new BigUser().name ); // Godzilla, полÑÑили ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ
Ð Ð²Ð¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ñ Ð¿ÑÑÑÑм return (или Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿Ð¾ÑÑавиÑÑ Ð¿ÑимиÑив поÑле return, неважно):
function SmallUser() {
this.name = "John";
return; // <-- возвÑаÑÐ°ÐµÑ this
}
alert( new SmallUser().name ); // John
ÐбÑÑно Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑов оÑÑÑÑÑÑвÑÐµÑ 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");
john.sayHi(); // ÐÐµÐ½Ñ Ð·Ð¾Ð²ÑÑ: John
/*
john = {
name: "John",
sayHi: function() { ... }
}
*/
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑложнÑÑ Ð¾Ð±ÑекÑов еÑÑÑ Ð¸ более пÑодвинÑÑÑй ÑинÑакÑÐ¸Ñ â клаÑÑÑ, коÑоÑÑй Ð¼Ñ ÑаÑÑмоÑÑим позже.
ÐÑого
- ФÑнкÑии-конÑÑÑÑкÑоÑÑ Ð¸Ð»Ð¸ пÑоÑÑо конÑÑÑÑкÑоÑÑ, ÑвлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми ÑÑнкÑиÑми, но ÑÑÑеÑÑвÑÐµÑ Ð¾Ð±ÑепÑинÑÑое ÑоглаÑение именоваÑÑ Ð¸Ñ Ñ Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ бÑквÑ.
- ФÑнкÑии-конÑÑÑÑкÑоÑÑ ÑледÑÐµÑ Ð²ÑзÑваÑÑ ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
new. Такой вÑзов подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ñоздание пÑÑÑогоthisв наÑале и возвÑÐ°Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ в конÑе.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ñ Ð¾Ð±ÑекÑов.
JavaScript пÑедоÑÑавлÑÐµÑ ÑÑнкÑии-конÑÑÑÑкÑоÑÑ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва вÑÑÑоеннÑÑ
обÑекÑов ÑзÑка: ÑакиÑ
как Date, Set, и дÑÑгиÑ
, коÑоÑÑе нам еÑÑ Ð¿ÑедÑÑÐ¾Ð¸Ñ Ð¸Ð·ÑÑиÑÑ.
Ð ÑÑой главе Ð¼Ñ ÑаÑÑмоÑÑели ÑолÑко оÑÐ½Ð¾Ð²Ñ Ð¾Ð±ÑекÑов и конÑÑÑÑкÑоÑов. ÐÐ°Ð½Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° нам Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего изÑÑÐµÐ½Ð¸Ñ Ñипов даннÑÑ Ð¸ ÑÑнкÑий в поÑледÑÑÑÐ¸Ñ Ð³Ð»Ð°Ð²Ð°Ñ .
Ðак ÑолÑко Ð¼Ñ Ñ Ð½Ð¸Ð¼Ð¸ ÑазбеÑÑмÑÑ, Ð¼Ñ Ð²ÐµÑнÑмÑÑ Ðº обÑекÑам Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ деÑалÑного изÑÑÐµÐ½Ð¸Ñ Ð² Ð³Ð»Ð°Ð²Ð°Ñ ÐÑоÑоÑипÑ, наÑледование и ÐлаÑÑÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)