Object.create (নাল) দিয়ে জেএস অবজেক্ট তৈরি করা হচ্ছে?


150

আমি জেএস অবজেক্ট তৈরির অনেক উপায় জানি কিন্তু এর কোনটিই আমি জানতাম না Object.create(null)

প্রশ্ন:

এটি কি ঠিক একইরকম:

var p = {}

বনাম

var p2 = Object.create(null);

?

উত্তর:


199

তারা সমতুল্য নয়। {}.constructor.prototype == Object.prototypeযদিও Object.create(null)কোনও কিছুর থেকে উত্তরাধিকারসূত্রে আসে না এবং এগুলির কোনও সম্পত্তি নেই।

অন্য কথায়: ডিফল্ট দ্বারা নির্বাচিত অবজেক্টে কোনও জাভাস্ক্রিপ্ট অবজেক্ট উত্তরাধিকারী, আপনি স্পষ্টভাবে এটি নাল সঙ্গে তার প্রোটোটাইপ হিসেবে তৈরি যদি না, মত: Object.create(null)

{}পরিবর্তে সমতুল্য হবে Object.create(Object.prototype)


ক্রোম ডিভটোলে আপনি দেখতে পাচ্ছেন যে Object.create(null)এর কোনও __proto__সম্পত্তি {}নেই while

এখানে চিত্র বর্ণনা লিখুন


99

তারা অবশ্যই সমতুল্য নয়। আমি কেন এই পার্থক্য তৈরি করে তা পুরোপুরি ব্যাখ্যা করার জন্য এই উত্তরটি লিখছি।

  1. var p = {};

    বৈশিষ্ট্য এবং পদ্ধতি উত্তরাধিকারসূত্রে প্রাপ্ত এমন একটি বস্তু তৈরি করে Object

  2. var p2 = Object.create(null);

    এমন একটি বস্তু তৈরি করে যা কোনও কিছুর উত্তরাধিকারী হয় না।

আপনি যদি কোনও মানচিত্র হিসাবে কোনও অবজেক্ট ব্যবহার করছেন এবং উপরের পদ্ধতি 1 ব্যবহার করে আপনি কোনও অবজেক্ট তৈরি করেন, তবে মানচিত্রে লুকআপ করার সময় আপনাকে অতিরিক্ত সতর্কতা অবলম্বন করতে হবে। বৈশিষ্ট্য এবং পদ্ধতিগুলি Objectউত্তরাধিকার সূত্রে প্রাপ্ত হওয়ায় আপনার কোডটি এমন কোনও ক্ষেত্রে চলে যেতে পারে যেখানে মানচিত্রের কীগুলি রয়েছে যা আপনি কখনই প্রবেশ করেন নি। উদাহরণস্বরূপ, আপনি যদি সন্ধান করেন তবে আপনি toStringকোনও ফাংশনটি খুঁজে পাবেন, যদিও আপনি কখনও সেই মানটি রাখেন নি। আপনি এটির মতো কাজ করতে পারেন:

if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
    // we actually inserted a 'toString' key into p
}

মনে রাখবেন যে এটিকে কিছু বরাদ্দ করা ভাল p.toString, এটি উত্তরাধিকার সূত্রে প্রাপ্ত toStringক্রিয়াকলাপটি কেবল ওভাররাইড করবে p

মনে রাখবেন আপনি কেবল এটি করতে পারবেন না p.hasOwnProperty('toString')কারণ আপনি একটি কী "hasOwnProperty" pin োকানো থাকতে পারে , তাই আমরা এটি প্রয়োগ প্রয়োগ করতে বাধ্য করি Object

অন্যদিকে, আপনি যদি উপরে 2 পদ্ধতি ব্যবহার Objectকরেন তবে মানচিত্রে উপস্থিত হওয়া থেকে আপনাকে জিনিসগুলি নিয়ে চিন্তা করতে হবে না ।

আপনি এর ifমতো সরল কোনও সম্পত্তির অস্তিত্ব পরীক্ষা করতে পারবেন না :

// Unreliable:
if (p[someKey]) {
    // ...
}

মানটি একটি খালি স্ট্রিং হতে পারে, হতে পারে false, বা null, বা undefined, বা 0, বা NaN, ইত্যাদি a কোনও সম্পত্তি আদৌ বিদ্যমান কিনা তা পরীক্ষা করতে আপনাকে এখনও ব্যবহার করতে হবে Object.prototype.hasOwnProperty.call(p, someKey)


6
কোনও সম্পত্তির অস্তিত্বের জন্য যাচাইয়ের জন্য একটি সহজ বিকল্প হ'ল:if (someKey in p) {
এমক্রোকল

2
@mrcrowl কেবলমাত্র যদি তারা ব্যবহার করে Object.create(null)। আমি এরকম অনুমান না করা পছন্দ করি, এমনকি যদি আপনি এটির ব্যবহারে একেবারে সঠিক হয়ে থাকেন Object.create(null)তবে কোডটি পরিবর্তন হতে পারে, অবজেক্টটি কোনও এক জায়গায় উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে ObjecthasOwnPropertyসর্বদা কাজ করে।
দাগ 65536

1
আমি এই জাতীয় কিছু সম্পর্কে যত্নবান হওয়া অপ্রয়োজনীয় হওয়া উচিত বলে মনে করি। আমি আপনার উত্তরটির প্রশংসা করি তবে ডকুমেন্টেশনের মাধ্যমে আপনি যে কোডটি নিয়ে কাজ করছেন তার সাথে কাজ করার জন্য প্রয়োজনীয় এপিআই দেওয়া উচিত। আপনি যদি গিথুব থেকে কিছু এলোমেলো কোড ধরছেন, তবে আপনি এটি কাঁটাচামচ করতে পারেন এবং কম ডকুমেন্টেড আপডেট থেকে নিরাপদ থাকতে পারেন। উল্লেখ করার {}অপেক্ষা রাখে না Object.create(null)যে এর চেয়ে বেশি প্রচলিত যে , যদি আপনার কোডটি ঘটনাক্রমে এই সময়ে উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিটি ধরে নেয় তবে আপনার চিন্তার উপায় সম্ভবত বড় বড় বাগ রয়েছে। আমি কেবল লোককে অপ্রয়োজনীয় অপ্টিমাইজেশন হিসাবে Object.create (নাল) ব্যবহার করে দেখতে পাচ্ছি।
aaaaaa

ডাবল অস্বীকৃতি !!p[key]সঙ্গে ভাল কাজ করে Object.create(null)। তবে hasKey = (key, input) => Object.prototype.hasOwnProperty.call(input, key)হয় না খারাপ
অ্যান্ড্রিড

> নোট করুন যে আপনি কেবল p.hasOwnProperty ('toString') করতে পারবেন না কারণ আপনি সম্ভবত একটি "hasOwNProperty" কী প্রবেশ করিয়েছেন, সুতরাং আমরা এটিকে অবজেক্টে প্রয়োগটি ব্যবহার করতে বাধ্য করি। এটি অপ্রয়োজনীয়। এই ক্ষেত্রে, আপনি কোনও পদ্ধতি ব্যবহার করতে পারবেন না pকারণ প্রতিটি পদ্ধতি sertedোকানো যেতে পারে এবং তাই নিরাপদ হয়ে উঠতে পারে না।
xianshenglu

1

ব্যবহার করে {}অবজেক্ট তৈরি করা এমন একটি বস্তু তৈরি করবে যার প্রোটোটাইপ Object.prototypeযা Objectপ্রোটোটাইপ থেকে মৌলিক ফাংশনগুলির উত্তরাধিকার সূত্রে ব্যবহার করে অবজেক্ট তৈরি Object.create(null)করার সময় একটি ফাঁকা অবজেক্ট তৈরি করবে যার প্রোটোটাইপ নাল।


0

যদি কেউ বাস্তবায়নের সন্ধান করে তবে Object.create(null)এটি কীভাবে কাজ করে তা কেবল জানতে। এটি এমনটি ব্যবহার করে লেখা হয়েছে __proto__যা অ-মানক এবং তাই, আমি এটির প্রস্তাব দিই না

function objectCreateMimic()
{
  /*optional parameters: prototype_object, own_properties*/
  var P = arguments.length>0?arguments[0]:-1;
  var Q = arguments.length>1?arguments[1]:null;
  var o = {};
  if(P!==null && typeof P === "object")
  {
    o.__proto__ = P;
  }
  else if(P===null)
  {
    o.__proto__ = null;
  }
  if(Q!==null && typeof Q === "object")
  {
   for(var key in Q)
   {
     o[key] = Q[key];
   }
  }
  return o;
}

দ্রষ্টব্য : আমি কৌতূহল ছাড়াই এটি লিখেছি এবং এটি কেবল সহজ ভাষায় লেখা হয়েছে উদাহরণস্বরূপ, আমি সম্পত্তি বিবরণকারীকে দ্বিতীয় বস্তু থেকে রিটার্ন অবজেক্টে স্থানান্তর করছি না।


1
নোট করুন যে গ্রীষ্মে ECMAScript প্রকাশিত হয়েছে, __proto__এখন আনুষ্ঠানিকভাবে ভাষার অংশ হয়ে যাবে।
চিরু

1
কেন -1arguments.length>0?arguments[0]:-1;?
শুভ_মারমোসেট

@ হ্যাপি_মারমোসেট দেরিতে প্রতিক্রিয়া দেখায় তবে দেখে মনে হচ্ছে এটি কেবল একটি নন-নাল স্থানধারক যাতে Objectপ্রথম যুক্তি না দেওয়া হয় তবে প্রোটোটাইপটি ধরে রাখা যায়। পরিবর্তনশীল নামগুলি এখানে আরও ভাল হতে পারে।
মাইক হিল

এছাড়াও, দ্বিতীয় প্যারামিটারটিতে প্রকৃত বৈশিষ্ট্যগুলি না দিয়ে সম্পত্তি বর্ণনাকারীদের বর্ণনা করা উচিত । রেফারেন্সটি এখানে দেখুন: ডেভেলপার.মোজিলা.আর.ইন-
মাইক হিল

0

আপনি যখন Object.create (নাল) দিয়ে একটি অবজেক্ট তৈরি করেন তার অর্থ আপনি কোনও প্রোটোটাইপ ছাড়াই একটি অবজেক্ট তৈরি করছেন। নাল এখানে প্রোটোটাইপ শৃঙ্খলার শেষ মানে। তবুও আপনি যখন object like অবজেক্ট প্রোটোটাইপের মতো কোনও বিষয় তৈরি করবেন তখন যুক্ত হবে। সুতরাং এটি দুটি পৃথক বস্তু, একটি প্রোটোটাইপ সহ প্রোটোটাইপ ছাড়াই। এটি সাহায্য করে ope

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