ฉันจะเข้าถึงเมธอด Object.prototype ด้วยตรรกะต่อไปนี้ได้อย่างไร


94

ฉันใช้ตรรกะต่อไปนี้เพื่อรับสตริง i18n ของคีย์ที่กำหนด

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

ฉันใช้ ESLint ในโครงการของฉัน ฉันได้รับข้อผิดพลาดต่อไปนี้:

อย่าเข้าถึงเมธอด Object.prototype 'hasOwnProperty' จากออบเจ็กต์เป้าหมาย เป็นข้อผิดพลาด' ไม่มีต้นแบบในตัว '

ฉันจะเปลี่ยนรหัสเพื่อแก้ไขข้อผิดพลาดนี้ได้อย่างไร ฉันไม่ต้องการปิดใช้กฎนี้


10
คุณควรอ่านเอกสาร มีตัวอย่างโค้ดที่ถูกต้อง ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
แนะนำให้คุณใช้Object.hasOwnProperty(entries,key)?
ความหลงใหล

รหัสใช้งานได้ดี นี่เป็นข้อผิดพลาดที่เป็นขุย ฉันแค่ต้องการแก้ไขไวยากรณ์เพื่อให้เป็นที่พอใจของกฎการทับถม
booYah

1
@passion ที่จะทำให้สตริงentriesไม่สนใจkeyและตรวจสอบว่าObjectมีคุณสมบัติที่มีสตริงนั้นหรือไม่
Oriol

คำตอบ:


164

คุณสามารถเข้าถึงได้ทางObject.prototype:

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

ที่น่าจะปลอดภัยกว่าเพราะ

  • ไม่ใช่วัตถุทั้งหมดที่สืบทอดมาจาก Object.prototype
  • แม้สำหรับวัตถุที่สืบทอดมาจากObject.prototypeที่hasOwnPropertyวิธีการอาจจะเงาโดยอย่างอื่น

แน่นอนว่าโค้ดด้านบนอนุมานได้ว่า

  • โลกObjectไม่ได้ถูกเงาหรือถูกกำหนดใหม่
  • พื้นเมืองObject.prototype.hasOwnPropertyไม่ได้รับการกำหนดใหม่
  • ไม่มีcallการเพิ่มทรัพย์สินของตัวเองObject.prototype.hasOwnProperty
  • พื้นเมืองFunction.prototype.callไม่ได้รับการกำหนดใหม่

หากสิ่งเหล่านี้ไม่เกิดขึ้นการพยายามโค้ดด้วยวิธีที่ปลอดภัยกว่านี้คุณอาจทำให้โค้ดของคุณเสียหาย

อีกแนวทางหนึ่งที่ไม่จำเป็นต้องcallใช้

!!Object.getOwnPropertyDescriptor(obj, prop);

16

สำหรับกรณีเฉพาะของคุณตัวอย่างต่อไปนี้จะใช้ได้:

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

หรือ

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

หรือ

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

11

ดูเหมือนว่าสิ่งนี้จะใช้ได้เช่นกัน:

key in entries

เนื่องจากจะส่งคืนบูลีนว่ามีคีย์อยู่ในวัตถุหรือไม่


3
hasOwnPropertyตรวจสอบว่าสตริงหรือสัญลักษณ์เป็นคุณสมบัติของตัวเองหรือไม่ key in entriesตรวจสอบว่าเป็นของตัวเองหรือสืบทอดมา
Oriol

0

ฉันหวังว่าฉันจะไม่ถูกโหวตลงคะแนนสำหรับเรื่องนี้อาจจะ แต่!

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

มีตราบเท่าไม่เคยทำลายรหัสของฉัน😬 แต่ฉันไม่แน่ใจว่าเป็นเช่นนั้นในเว็บเบราว์เซอร์ทั้งหมดหรือไม่ ...

(นอกจากนี้หากCanadarmไม่ได้กำหนดรหัสของคุณจะดูเหมือนว่าreturn entries[key];แม้ว่าคีย์จะไม่อยู่ในรายการ ... )


1
ปัญหาคือถ้าaมีต้นแบบที่มีcสิ่งนั้นจะเกิดขึ้น Js จะขึ้นโซ่ต้นแบบ
Bernardo Dal Corno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.