Dalam JavaScript kita memiliki beberapa cara untuk mendapatkan properti dari suatu objek, bergantung pada apa yang ingin kita dapatkan.
1) Object.keys()
, yang mengembalikan semua properti objek yang tak terhitung jumlahnya, metode ECMA5.
2) for...in
perulangan, yang mengembalikan semua properti yang dapat dihitung dari suatu objek, terlepas dari apakah itu properti sendiri, atau diwarisi dari rantai prototipe.
3) Object.getOwnPropertyNames(obj)
yang mengembalikan semua properti sendiri dari suatu objek, dapat dihitung atau tidak.
Kami juga memiliki metode seperti hasOwnProperty(prop)
memungkinkan kami memeriksa apakah properti diwariskan atau benar-benar milik objek itu, dan propertyIsEnumerable(prop)
yang, seperti namanya, memungkinkan kami memeriksa apakah properti dapat dihitung.
Dengan semua opsi ini, tidak ada cara untuk mendapatkan properti non-enumerable, non-own dari suatu objek, yang ingin saya lakukan. Apakah ada cara untuk melakukan ini? Dengan kata lain, dapatkah saya mendapatkan daftar properti warisan yang tidak dapat dihitung?
Terima kasih.
sumber
Jawaban:
Karena
getOwnPropertyNames
dapat memberi Anda properti yang tidak dapat dihitung, Anda dapat menggunakannya dan menggabungkannya dengan menjalankan rantai prototipe.Saya mengujinya di Safari 5.1 dan mendapatkan
Pembaruan: Memperbaiki kode sedikit (spasi tambahan, dan kurung kurawal, dan meningkatkan nama fungsi):
sumber
while(curr = Object.getPrototypeOf(cure))
karena pernyataan bersyarat menggunakan operator penugasan alih-alih operator perbandingan, bukankah ini selalu mengembalikan nilai true? Atau baris ini pada dasarnya memeriksa apakah "current" memiliki prototipe?Object.getPrototypeOf(cure)
kembalinull
di bagian atas rantai prototipe. Saya kira ini mengasumsikan tidak ada rantai prototipe melingkar!Function.prototype
tidak pernah bisa menjadi prototipe "root", karena itu adalah prototipe link yang mengarah keObject.prototype
. FungsiObject.getPrototypeOf( obj )
mengembalikan objek paling atas dalam rantai prototipeobj
. Ini memungkinkan Anda untuk mengikuti rantai prototipeobj
hingga Anda mencapai akhirnya (null
nilainya). Saya tidak yakin apa masalah Anda dengan ini ...undefined
.Object.getPrototypeOf(John)
mengembalikanBoy.prototype
objek (sebagaimana mestinya) - lihat di sini: jsfiddle.net/aeGLA/1 . Perhatikan bahwa constructorBoy
adalah tidak dalam rantai prototipeJohn
. Rantai prototipe dariJohn
adalah sebagai berikut:Boy.prototype -> Object.prototype -> null
.John
, konstruktornya adalahBoy
, danprototype
properti dariBoy
adalahBoy.prototype
. JadiObject.getPrototypeOf(John)
kembaliBoy.prototype
.Solusi yang lebih bersih menggunakan rekursi:
Edit
Fungsi yang lebih umum:
Template yang sama ini dapat diterapkan menggunakan
Object.getOwnPropertySymbols
, dll.sumber
Memanfaatkan Sets mengarah ke solusi yang agak lebih bersih, IMO.
sumber
Iteratif lurus ke depan di ES6:
Contoh run:
Tampilkan cuplikan kode
sumber
Untuk mendapatkan semua properti atau metode yang diwariskan untuk beberapa contoh, Anda dapat menggunakan sesuatu seperti ini
sumber
Object.getInherited
daripadaObject.prototype.getInherited
. Melakukan itu juga menghilangkan kebutuhan akan!(name == 'getInherited')
cek jelek . Selain itu, dalam implementasi Anda,props
larik dapat berisi properti duplikat. Terakhir, apa tujuan mengabaikanconstructor
properti?Berikut adalah solusi yang saya dapatkan saat mempelajari subjek. Untuk mendapatkan semua properti non-milik non-enumerable dari
obj
objek lakukangetProperties(obj, "nonown", "nonenum");
sumber
Contoh penggunaan:
sumber
jika Anda mencoba untuk membuat log properti yang tidak dapat dihitung dari objek induk misalnya. secara default metode yang didefinisikan di dalam kelas di es6 diatur pada prototipe tetapi ditetapkan sebagai non-enumerable.
sumber
Penerapan dalam preferensi pribadi saya :)
sumber