Bagaimana cara mengakses metode Object.prototype dalam logika berikut?

92

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.

booYah
sumber
9
Anda mungkin harus membaca dokumennya. Ada contoh kode yang benar ~ eslint.org/docs/rules/no-prototype-builtins
Phil
1
Sarankan Anda untuk menggunakan Object.hasOwnProperty(entries,key)?
passion
Kode berfungsi dengan baik. Ini adalah kesalahan linting. Saya hanya ingin mengubah sintaks sehingga aturan linting terpenuhi.
booYah
1
@passion Itu akan merangkai entries, mengabaikan key, dan memeriksa apakah Objectmemiliki properti dengan string itu.
Oriol

Jawaban:

150

Anda dapat mengaksesnya melalui Object.prototype:

Object.prototype.hasOwnProperty.call(obj, prop);

Itu seharusnya lebih aman, karena

  • Tidak semua objek diwarisi dari Object.prototype
  • Bahkan untuk objek yang diwarisi Object.prototype, hasOwnPropertymetode ini dapat dibayangi oleh hal lain.

Tentu saja, kode di atas mengasumsikan itu

  • Global Objectbelum dibayangi atau didefinisikan ulang
  • Native Object.prototype.hasOwnPropertybelum didefinisikan ulang
  • Tidak ada callproperti sendiri yang ditambahkan keObject.prototype.hasOwnProperty
  • Native Function.prototype.callbelum didefinisikan ulang

Jika salah satu dari ini tidak berlaku, mencoba membuat kode dengan cara yang lebih aman, Anda dapat merusak kode Anda!

Pendekatan lain yang tidak perlu calladalah

!!Object.getOwnPropertyDescriptor(obj, prop);
Oriol
sumber
14

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
}
Zameer Ansari
sumber
11

Sepertinya ini juga akan berhasil:

key in entries

karena itu akan mengembalikan boolean pada apakah kunci ada di dalam objek atau tidak?

Mike Mathew
sumber
3
hasOwnPropertymemeriksa apakah sebuah string atau simbol adalah milik sendiri. key in entriesmemeriksa apakah itu milik sendiri atau warisan.
Oriol
0

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 Canadarmtidak ditentukan, kode Anda tampaknya return entries[key];bahkan jika kunci tidak ada dalam entri ...)

Albert James Teddy
sumber
1
Masalahnya adalah jika amemiliki prototipe yang TIDAK dimiliki c, itu akan terjadi. Js akan naik rantai prototipe
Bernardo Dal Corno