СÑвоÑÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обâÑкÑа з одинаковим конÑÑÑÑкÑоÑом
УÑвÑÑÑ ÑобÑ, Ñ Ð½Ð°Ñ Ñ Ð´Ð¾Ð²ÑлÑний обâÑÐºÑ obj, Ñкий ÑÑвоÑений ÑÑнкÑÑÑÑ-конÑÑÑÑкÑоÑом â ми не знаÑмо Ñким Ñаме конÑÑÑÑкÑоÑом, але поÑÑÑбно ÑÑвоÑиÑи новий обâÑÐºÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑи Ñой Ñамий конÑÑÑÑкÑоÑ.
Чи можна ÑÑвоÑиÑи новий обâÑÐºÑ Ð¾ÑÑ Ñак?
let obj2 = new obj.constructor();
ÐокажÑÑÑ Ð¿Ñиклад ÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа Ð´Ð»Ñ Ð¾Ð±ÑкÑа obj, Ñкий забезпеÑиÑÑ Ð¿ÑавилÑÐ½Ñ ÑобоÑÑ Ñакого кодÑ, а Ñакож пÑиклад, Ñкий, пÑи ÑÐ°ÐºÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ, пÑаÑÑÑ Ð½ÐµÐ¿ÑавилÑно.
Так, ми можемо викоÑиÑÑовÑваÑи Ñакий пÑдÑ
Ñд ÑкÑо ми впевненÑ, Ñо влаÑÑивÑÑÑÑ "constructor" Ð¼Ð°Ñ Ð¿ÑавилÑне знаÑеннÑ.
ÐапÑиклад, ÑкÑо ми не ÑÑпаÑмо влаÑÑивÑÑÑÑ Ð·Ð° замовÑÑваннÑм "prototype", ÑÐ¾Ð´Ñ Ñей код бÑде пÑаÑÑваÑи пÑавилÑно:
function User(name) {
this.name = name;
}
let user = new User('Ðогдан');
let user2 = new user.constructor('Ðанило');
alert( user2.name ); // Ðанило (пÑаÑÑÑ!)
Ðод пÑаÑÑÑ, ÑÐ¾Ð¼Ñ Ñо User.prototype.constructor == User.
â¦Ðле ÑкÑо Ñ
ÑоÑÑ, ÑкÑо можна Ñак виÑазиÑиÑÑ, пеÑезапиÑе User.prototype Ñ Ð·Ð°Ð±Ñде додаÑи влаÑÑивÑÑÑÑ constructor в поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¾Ð±âÑкÑа User, ÑÐ¾Ð´Ñ Ñей код не бÑде пÑаÑÑваÑи пÑавилÑно.
ÐапÑиклад:
function User(name) {
this.name = name;
}
User.prototype = {}; // (*)
let user = new User('Ðогдан');
let user2 = new user.constructor('Ðанило');
alert( user2.name ); // undefined
Ð§Ð¾Ð¼Ñ user2.name Ñ undefined?
ÐÑÑ ÑÑÑ Ð¿Ð¾ÑÑÐ½ÐµÐ½Ð½Ñ Ñк new user.constructor('Ðанило') пÑаÑÑÑ:
- СпоÑаÑкÑ, здÑйÑнÑÑÑÑÑÑ Ð¿Ð¾ÑÑк Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ
constructorобâÑкÑаuser. ÐÑÑого не Ð·Ð½Ð°Ñ Ð¾Ð´ÑÑÑ. - ÐоÑÑм пеÑеклÑÑаÑÑÑÑÑ Ð½Ð° ланÑÑжок пÑоÑоÑипÑ. ÐÑоÑоÑипом Ð´Ð»Ñ Ð¾Ð±âÑкÑа
userÑUser.prototype, Ñ Ð²Ñн Ñакож не Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивоÑÑÑconstructor(ÑÐ¾Ð¼Ñ Ñо ми âзабÑлиâ пÑизнаÑиÑи його пÑавилÑним Ñином!). - ÐдÑÑи Ð´Ð°Ð»Ñ Ð¿Ð¾ ланÑÑÐ¶ÐºÑ Ð¿ÑоÑоÑипÑ, визнаÑаÑмо, Ñо
User.prototypeÑ Ð¿ÑоÑÑий обâÑкÑ, його пÑоÑоÑипом Ñ Ð²Ð±Ñдований глобалÑнийObject.prototype. - ÐÑеÑÑÑ, Ð´Ð»Ñ Ð²Ð±Ñдованого
Object.prototype, Ñ Ð²Ð±Ñдований конÑÑÑÑкÑÐ¾Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного обâÑкÑаObject.prototype.constructor == ObjectÐ¾Ñ Ð²Ñн Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ.
Таким Ñином, в кÑнÑÑ ÐºÑнÑÑв, ми оÑÑимÑÑмо Ñе ж Ñаме, Ñкби напиÑали let user2 = new Object('Ðанило').
ÐмовÑÑно, Ñе не Ñе, Ñо нам поÑÑÑбно. Ðи би Ñ
оÑÑли ÑÑовÑиÑи new User, а не new Object. Це Ñ Ñ Ð½Ð°ÑлÑдки пÑопÑÑÐºÑ Ð²Ð»Ð°ÑÑивоÑÑÑ constructor.
(на випадок, ÑкÑо Ð²Ð°Ñ Ð·Ð°ÑÑкавиÑÑ, виклик new Object(...) пеÑеÑвоÑÑÑ Ð¹Ð¾Ð³Ð¾ аÑгÑменÑи на обâÑкÑ. Це в ÑеоÑÑÑ, але на пÑакÑиÑÑ Ð½ÑÑ
Ñо не Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ new Object з аÑгÑменÑами; Ñ Ð·Ð°Ð³Ð°Ð»Ð¾Ð¼, new Object майже не викоÑиÑÑовÑÑÑÑ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ
обâÑкÑÑв).