Buat sebuah objek dengan konstruktor yang sama
Bayangkan, kita memiliki objek yang berubah-ubah, dibuat dengan menggunakan fungsi konstruktor – kita tidak tahu yang mana, tapi kita ingin membuat sebuah objek menggunakannya.
Bisakah kita melakukannya?
let obj2 = new obj.constructor();Beri sebuah contoh dari menggunakan fungsi konstruktor untuk obj yang mana membiarkan kode seperti itu bekerja. Dan sebuah contoh yang mana membuat kodenya menjadi tidak bekerja semestinya.
Kita bisa menggunakan pendekatan jika kita yakin properti "constructor" memiliki nilai yang benar.
Contoh, kita tidak ingin menyentuh "prototype" bawaan, maka kode ini akan berjalan dengan semestinya:
function User(name) {
  this.name = name;
}
let user = new User('John');
let user2 = new user.constructor('Pete');
alert( user2.name ); // Pete (bekerja!)Kode diatas bekerja karena User.prototype.constructor == User.
Tapi jika seseorang, menimpah User.prototype dan lupa untuk membuat ulang constructor untuk User, maka akan membuat kegagalan.
Contoh:
function User(name) {
  this.name = name;
}
User.prototype = {}; // (*)
let user = new User('John');
let user2 = new user.constructor('Pete');
alert( user2.name ); // undefinedKenapa user2.name menghasilan undefined?
Ini bagaimana new user.constructor('Pete') bekerja:
- Pertama, mencari constructordiuser. Tidak ada.
- Kemudian mengikuti rantai prototipe. Prototipe useradalahUser.prototype, dan juga tidak memilikiconstructor(karena kita “lupa” untuk menyetelnya dengan benar!).
- Lebih jauh ke atas rantai, User.prototypeadalah objek biasa, prototipenya adalahObject.prototypebawaan.
- Terakhir, untuk Object.prototypebawaan, adaObject.prototype.constructor == Objectbawaan. Jadi itu digunakan.
Akhirnya, pada akhirnya, kita memiliki let user2 = new Object('Pete').
Mungkin, bukan itu yang kita inginkan. Kami ingin membuat Pengguna baru, bukan Objek baru. Itulah hasil dari konstruktor yang hilang.
(Untuk berjaga-jaga jika Anda penasaran, panggilan new Object(...) mengubah argumennya menjadi objek. Itu hal teoretis, dalam praktiknya tidak ada yang memanggil Objek baru dengan nilai, dan umumnya kami tidak’ t gunakan objek baru untuk membuat objek sama sekali).