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 ); // undefined
Kenapa user2.name
menghasilan undefined
?
Ini bagaimana new user.constructor('Pete')
bekerja:
- Pertama, mencari
constructor
diuser
. Tidak ada. - Kemudian mengikuti rantai prototipe. Prototipe
user
adalahUser.prototype
, dan juga tidak memilikiconstructor
(karena kita ???lupa??? untuk menyetelnya dengan benar!). - Lebih jauh ke atas rantai,
User.prototype
adalah objek biasa, prototipenya adalahObject.prototype
bawaan. - Terakhir, untuk
Object.prototype
bawaan, adaObject.prototype.constructor == Object
bawaan. 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).