নিম্নলিখিত যুক্তিতে আমি কীভাবে অবজেক্ট.প্রোটোটাইপ পদ্ধতিতে অ্যাক্সেস করব?


91

প্রদত্ত কীটির আই 18 এন স্ট্রিং পেতে আমি নীচের যুক্তিটি ব্যবহার করছি।

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

আমি আমার প্রকল্পে ইএসলিন্ট ব্যবহার করছি। আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

লক্ষ্য বস্তু থেকে অবজেক্ট.প্রোটোটাইপ পদ্ধতি 'hasOwnProperty' অ্যাক্সেস করবেন না। এটি একটি ' নো প্রোটোটাইপ-বিল্টিনস ' ত্রুটি।

এই ত্রুটিটি সমাধান করার জন্য আমি কীভাবে আমার কোড পরিবর্তন করব? আমি এই নিয়মটি অক্ষম করতে চাই না।


9
আপনার সম্ভবত ডক্সটি পড়া উচিত। সঠিক কোডের উদাহরণ রয়েছে ~ eslint.org/docs/rules/no-prototype-builtins
ফিল

4
আপনি ব্যবহার করার পরামর্শ Object.hasOwnProperty(entries,key)?
আবেগ

কোডটি ঠিকঠাক কাজ করছে। এটি একটি প্রচ্ছন্নতা ত্রুটি। আমি কেবল সিনট্যাক্সটি পরিবর্তন করতে চাই যাতে লেটিংয়ের নিয়মটি সন্তুষ্ট হয়।
বুয়াহ

4
@ করুণাটি সেই স্ট্রিংয়ের সাথে সম্পত্তি আছে কিনা তা পরীক্ষা করবে entries, উপেক্ষা করবে keyএবং তা পরীক্ষা করবে Object
অরিওল 1

উত্তর:


149

আপনি এটির মাধ্যমে অ্যাক্সেস করতে পারেন Object.prototype:

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

এটি নিরাপদ হওয়া উচিত, কারণ

  • সমস্ত বস্তু উত্তরাধিকারসূত্রে প্রাপ্ত হয় না Object.prototype
  • এমনকি প্রাপ্ত বস্তুগুলির জন্যও Object.prototype, hasOwnPropertyপদ্ধতিটি অন্য কোনও কারণে ছায়াযুক্ত হতে পারে something

অবশ্যই, উপরের কোডটি ধরে নিয়েছে

  • বিশ্বব্যাপী Objectছায়া গো বা নতুন সংজ্ঞা দেওয়া হয়নি
  • নেটিভ Object.prototype.hasOwnPropertyপুনরায় সংজ্ঞায়িত করা হয়েছে
  • কোনও callনিজস্ব সম্পত্তি যুক্ত করা হয়নিObject.prototype.hasOwnProperty
  • নেটিভ Function.prototype.callপুনরায় সংজ্ঞায়িত করা হয়েছে

এর মধ্যে যদি কোনওটি ধরে না রাখে, নিরাপদে কোড দেওয়ার চেষ্টা করে আপনি আপনার কোডটি ভেঙে ফেলতে পারেন!

আর একটি পদ্ধতির প্রয়োজন নেই যা callহতে পারে

!!Object.getOwnPropertyDescriptor(obj, prop);

14

আপনার নির্দিষ্ট ক্ষেত্রে, নিম্নলিখিত উদাহরণগুলি কাজ করবে:

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

যেহেতু এটি কি কি বস্তুর ভিতরে কী বিদ্যমান কিনা তা নিয়ে একটি বুলিয়ান ফিরিয়ে দেবে?


4
hasOwnPropertyকোনও স্ট্রিং বা প্রতীক নিজস্ব সম্পত্তি কিনা তা পরীক্ষা করে। key in entriesএটি নিজস্ব বা উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা পরীক্ষা করে।
ওরিওল

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];কীগুলি এন্ট্রিগুলিতে না থাকলেও মনে হয় ...)


4
সমস্যা হচ্ছে যে যদি aএকটি প্রোটোটাইপ থাকে যা থাকে তবে তা cঘটবে। জেএস প্রোটোটাইপ চেইনে যাবে
বার্নার্ডো ডাল কর্নো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.