Làm cách nào để truy cập phương thức Object.prototype theo logic sau?


93

Tôi đang sử dụng logic sau để lấy chuỗi i18n của khóa đã cho.

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

Tôi đang sử dụng ESLint trong dự án của mình. Tôi nhận được lỗi sau:

Không truy cập phương thức Object.prototype 'hasOwnProperty' từ đối tượng đích. Đó là lỗi ' không có nguyên mẫu-nội trang '.

Làm cách nào để thay đổi mã của tôi để giải quyết lỗi này? Tôi không muốn tắt quy tắc này.


9
Bạn có thể nên đọc tài liệu. Có những ví dụ về đúng đang ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
Đề nghị bạn sử dụng Object.hasOwnProperty(entries,key)?
niềm đam mê

Mã đang hoạt động tốt. Đây là một lỗi in linting. Tôi chỉ muốn sửa đổi cú pháp để quy tắc linting được thỏa mãn.
booYah

1
@passion Điều đó sẽ xâu chuỗi entries, bỏ qua keyvà kiểm tra xem Objectcó thuộc tính với chuỗi đó hay không.
Oriol

Câu trả lời:


151

Bạn có thể truy cập nó qua Object.prototype:

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

Điều đó sẽ an toàn hơn, bởi vì

  • Không phải tất cả các đối tượng kế thừa từ Object.prototype
  • Ngay cả đối với các đối tượng kế thừa từ đó Object.prototype, hasOwnPropertyphương thức có thể bị che bởi một thứ khác.

Tất nhiên, đoạn mã trên giả định rằng

  • Toàn cầu Objectkhông bị che khuất hoặc xác định lại
  • Bản địa Object.prototype.hasOwnPropertychưa được xác định lại
  • Không có calltài sản riêng nào được thêm vàoObject.prototype.hasOwnProperty
  • Bản địa Function.prototype.callchưa được xác định lại

Nếu bất kỳ điều nào trong số này không giữ được, cố gắng viết mã theo cách an toàn hơn, bạn có thể đã bị hỏng mã của mình!

Một cách tiếp cận khác không cần callsẽ là

!!Object.getOwnPropertyDescriptor(obj, prop);

14

Đối với trường hợp cụ thể của bạn, các ví dụ sau sẽ hoạt động:

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

HOẶC LÀ

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

HOẶC LÀ

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

11

Có vẻ như điều này cũng sẽ hoạt động:

key in entries

vì điều đó sẽ trả về một boolean về việc liệu khóa có tồn tại bên trong đối tượng hay không?


3
hasOwnPropertykiểm tra xem một chuỗi hoặc ký hiệu có phải là thuộc tính riêng hay không. key in entrieskiểm tra xem đó là tài khoản riêng hay kế thừa.
Oriol

0

Tôi hy vọng tôi sẽ không bị bỏ phiếu vì điều này, có lẽ sẽ, nhưng!

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

Trong chừng mực, chưa bao giờ làm hỏng mã của tôi 😬 Nhưng tôi không chắc có đúng như vậy trong tất cả các trình duyệt web hay không ...

(Ngoài ra, nếu Canadarmkhông được xác định, mã của bạn dường như return entries[key];ngay cả khi khóa không có trong các mục nhập ...)


1
Vấn đề là nếu acó một nguyên mẫu KHÔNG có c, điều đó sẽ xảy ra. Js sẽ đi lên chuỗi nguyên mẫu
Bernardo Dal Corno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.