Saya menggunakan logika berikut untuk mendapatkan string i18n dari kunci yang diberikan.
export function i18n(key) {
if (entries.hasOwnProperty(key)) {
return entries[key];
} else if (typeof (Canadarm) !== 'undefined') {
try {
throw Error();
} catch (e) {
Canadarm.error(entries['dataBuildI18nString'] + key, e);
}
}
return entries[key];
}
Saya menggunakan ESLint dalam proyek saya. Saya mendapatkan kesalahan berikut:
Jangan mengakses metode Object.prototype 'hasOwnProperty' dari objek target. Ini adalah kesalahan ' tanpa prototipe-bawaan '.
Bagaimana cara mengubah kode saya untuk mengatasi kesalahan ini? Saya tidak ingin menonaktifkan aturan ini.
javascript
ecmascript-6
eslint
booYah
sumber
sumber
Object.hasOwnProperty(entries,key)
?entries
, mengabaikankey
, dan memeriksa apakahObject
memiliki properti dengan string itu.Jawaban:
Anda dapat mengaksesnya melalui
Object.prototype
:Object.prototype.hasOwnProperty.call(obj, prop);
Itu seharusnya lebih aman, karena
Object.prototype
Object.prototype
,hasOwnProperty
metode ini dapat dibayangi oleh hal lain.Tentu saja, kode di atas mengasumsikan itu
Object
belum dibayangi atau didefinisikan ulangObject.prototype.hasOwnProperty
belum didefinisikan ulangcall
properti sendiri yang ditambahkan keObject.prototype.hasOwnProperty
Function.prototype.call
belum didefinisikan ulangJika salah satu dari ini tidak berlaku, mencoba membuat kode dengan cara yang lebih aman, Anda dapat merusak kode Anda!
Pendekatan lain yang tidak perlu
call
adalah!!Object.getOwnPropertyDescriptor(obj, prop);
sumber
Untuk kasus spesifik Anda, contoh berikut akan berfungsi:
if(Object.prototype.hasOwnProperty.call(entries, "key")) { //rest of the code }
ATAU
if(Object.prototype.isPrototypeOf.call(entries, key)) { //rest of the code }
ATAU
if({}.propertyIsEnumerable.call(entries, "key")) { //rest of the code }
sumber
Sepertinya ini juga akan berhasil:
key in entries
karena itu akan mengembalikan boolean pada apakah kunci ada di dalam objek atau tidak?
sumber
hasOwnProperty
memeriksa apakah sebuah string atau simbol adalah milik sendiri.key in entries
memeriksa apakah itu milik sendiri atau warisan.Saya harap saya tidak akan diremehkan untuk ini, mungkin akan, tapi!
var a = {b: "I'm here"} if (a["b"]) { console.log(a["b"]) } if (a["c"]) { console.log("Never going to happen") }
Sejauh ini, tidak pernah merusak kode saya š¬ Tapi saya tidak yakin apakah itu yang terjadi di semua browser web ...
(Juga, jika
Canadarm
tidak ditentukan, kode Anda tampaknyareturn entries[key];
bahkan jika kunci tidak ada dalam entri ...)sumber
a
memiliki prototipe yang TIDAK dimilikic
, itu akan terjadi. Js akan naik rantai prototipe