Aşağıdaki mantıkta Object.prototype yöntemine nasıl erişebilirim?


93

Verilen anahtarın i18n dizesini almak için aşağıdaki mantığı kullanıyorum.

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];
}

Projemde ESLint kullanıyorum. Aşağıdaki hatayı alıyorum:

Hedef nesneden 'hasOwnProperty' Object.prototype yöntemine erişmeyin. Bu bir ' prototip yerleşik yok ' hatasıdır.

Bu hatayı çözmek için kodumu nasıl değiştiririm? Bu kuralı devre dışı bırakmak istemiyorum.


9
Muhtemelen belgeleri okumalısın. Doğru kod örnekleri var ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
Kullanmanı önerir misin Object.hasOwnProperty(entries,key)?
passion

Kod iyi çalışıyor. Bu bir tüylenme hatasıdır. Sadece sözdizimini değiştirmek istiyorum, böylece tüy bırakma kuralı karşılanır.
booYah

1
@passion Bu dizge ile bir özelliği olup olmadığını kontrol eder entries, yok sayar keyve kontrol eder Object.
Oriol

Yanıtlar:


151

Şuradan erişebilirsiniz Object.prototype:

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

Bu daha güvenli olmalı çünkü

  • Tüm nesneler Object.prototype
  • Kendisinden miras alan nesneler için bile Object.prototype, hasOwnPropertyyöntem başka bir şey tarafından gölgelenebilir.

Tabii ki, yukarıdaki kod şunu varsayar:

  • Küresel Objectgölgelenmedi veya yeniden tanımlanmadı
  • Yerli Object.prototype.hasOwnPropertyyeniden tanımlanmadı
  • Hiçbir callmülk eklenmediObject.prototype.hasOwnProperty
  • Yerli Function.prototype.callyeniden tanımlanmadı

Bunlardan herhangi biri tutmazsa, daha güvenli bir şekilde kodlamaya çalışırsanız, kodunuzu kırmış olabilirsiniz!

İhtiyaç duymayan başka bir yaklaşım callda

!!Object.getOwnPropertyDescriptor(obj, prop);

14

Özel durumunuz için aşağıdaki örnekler işe yarayacaktır:

if(Object.prototype.hasOwnProperty.call(entries, "key")) {
    //rest of the code
}

VEYA

if(Object.prototype.isPrototypeOf.call(entries, key)) {
    //rest of the code
}

VEYA

if({}.propertyIsEnumerable.call(entries, "key")) {
    //rest of the code
}

11

Bu da işe yarayacak gibi görünüyor:

key in entries

çünkü anahtarın nesnenin içinde olup olmadığına dair bir mantıksal değer döndürür?


3
hasOwnPropertybir dizenin veya sembolün kendi özelliği olup olmadığını kontrol eder. key in entrieskendi mi yoksa miras mı olduğunu kontrol eder.
Oriol

0

Umarım bunun için olumsuz oy verilmez, muhtemelen olur, ama!

var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }

Kodumu hiç kırmadı 😬 Ama tüm web tarayıcılarında böyle olup olmadığından emin değilim ...

(Ayrıca, Canadarmtanımlanmamışsa, return entries[key];anahtar girişlerde olmasa bile kodunuz görünür ...)


1
Sorun aşu ki, sahip olduğu bir prototip varsa c, bu olacak. Js prototip zincirinde yükselecek
Bernardo Dal Corno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.