Saya tahu banyak cara untuk membuat objek JS tapi saya tidak tahu Object.create(null)
itu.
Pertanyaan:
apakah persis sama dengan:
var p = {}
vs.
var p2 = Object.create(null);
?
sumber
Saya tahu banyak cara untuk membuat objek JS tapi saya tidak tahu Object.create(null)
itu.
Pertanyaan:
apakah persis sama dengan:
var p = {}
vs.
var p2 = Object.create(null);
?
Mereka tidak setara. {}.constructor.prototype == Object.prototype
sementara Object.create(null)
tidak mewarisi dari apa pun dan dengan demikian tidak memiliki sifat sama sekali.
Dengan kata lain: Sebuah javascript objek mewarisi dari Object secara default, kecuali Anda secara eksplisit membuat dengan null sebagai prototipe, seperti: Object.create(null)
.
{}
sebaliknya akan setara dengan Object.create(Object.prototype)
.
Di Chrome Devtool Anda dapat melihat bahwa Object.create(null)
tidak memiliki __proto__
properti, sementara itu {}
tidak.
Mereka jelas tidak setara. Saya menulis jawaban ini untuk lebih menjelaskan mengapa itu membuat perbedaan.
var p = {};
Menciptakan objek yang mewarisi properti dan metode dari Object
.
var p2 = Object.create(null);
Membuat objek yang tidak mewarisi apa pun.
Jika Anda menggunakan objek sebagai peta, dan Anda membuat objek menggunakan metode 1 di atas, maka Anda harus ekstra hati-hati saat melakukan pencarian di peta. Karena properti dan metode dari Object
diwarisi, kode Anda mungkin mengalami kasus di mana ada kunci di peta yang tidak pernah Anda masukkan. Misalnya, jika Anda melakukan pencarian toString
, Anda akan menemukan fungsi, meskipun Anda tidak pernah memberikan nilai itu di sana. Anda dapat menyiasatinya seperti ini:
if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
// we actually inserted a 'toString' key into p
}
Perhatikan bahwa tidak apa-apa untuk menetapkan sesuatu p.toString
, itu hanya akan menimpa toString
fungsi warisan p
.
Perhatikan bahwa Anda tidak bisa melakukan begitu saja p.hasOwnProperty('toString')
karena Anda mungkin telah memasukkan kunci "hasOwnProperty" ke dalam p
, jadi kami memaksanya untuk menggunakan implementasi di Object
.
Di sisi lain, jika Anda menggunakan metode 2 di atas, maka Anda tidak perlu khawatir tentang hal-hal yang Object
muncul di peta.
Anda tidak dapat memeriksa keberadaan properti dengan yang sederhana if
seperti ini:
// Unreliable:
if (p[someKey]) {
// ...
}
Nilai mungkin berupa string kosong, mungkin false
, atau null
, atau undefined
, atau 0
, atau NaN
, dll. Untuk memeriksa apakah suatu properti ada, Anda masih perlu menggunakan Object.prototype.hasOwnProperty.call(p, someKey)
.
if (someKey in p) {
Object.create(null)
. Saya lebih suka untuk tidak membuat asumsi seperti itu, bahkan jika Anda benar bahwa itu digunakanObject.create(null)
, kode dapat berubah, objek dapat diganti dengan yang mewarisiObject
di beberapa titik.hasOwnProperty
selalu berhasil.{}
jauh lebih lazim daripadaObject.create(null)
, bahwa jika kode Anda secara tidak sengaja mengambil properti yang diwarisi pada saat ini, Anda mungkin memiliki bug yang jauh lebih besar untuk dikhawatirkan. Saya hanya dapat melihat orang menggunakan Object.create (null) sebagai optimasi kecil.!!p[key]
bekerja dengan baikObject.create(null)
. TapihasKey = (key, input) => Object.prototype.hasOwnProperty.call(input, key)
tidak buruk baikp
karena setiap metode dapat dimasukkan dan menjadi tidak aman.Membuat objek dengan menggunakan
{}
akan membuat objek dengan prototipeObject.prototype
yang mewarisi fungsi dasar dariObject
prototipe sementara membuat objek dengan menggunakanObject.create(null)
akan membuat objek kosong yang prototipenya nol.sumber
Jika seseorang mencari implementasi
Object.create(null)
, hanya untuk mengetahui cara kerjanya. Itu ditulis menggunakan__proto__
yang non-standar dan karenanya, saya tidak merekomendasikannya .Catatan : Saya menulis ini, karena penasaran, dan hanya ditulis dalam istilah sederhana, misalnya, saya tidak mentransfer deskriptor properti dari objek kedua ke objek kembali.
sumber
__proto__
sekarang akan secara resmi menjadi bagian dari bahasa tersebut.-1
masukarguments.length>0?arguments[0]:-1;
?Object
prototipe dipertahankan jika argumen pertama tidak diberikan. Nama variabel bisa jauh lebih baik di sini.Ketika Anda membuat Obyek dengan Object.create (null) itu berarti Anda membuat Obyek tanpa prototipe. null di sini berarti akhir dari rantai prototipe. Namun demikian ketika Anda membuat objek seperti {} objek prototipe akan ditambahkan. Karenanya ini adalah dua objek yang berbeda, satu dengan prototipe yang lain tanpa prototipe. Semoga ini bisa membantu
sumber