উত্তর:
তারা সমতুল্য নয়। {}.constructor.prototype == Object.prototypeযদিও Object.create(null)কোনও কিছুর থেকে উত্তরাধিকারসূত্রে আসে না এবং এগুলির কোনও সম্পত্তি নেই।
অন্য কথায়: ডিফল্ট দ্বারা নির্বাচিত অবজেক্টে কোনও জাভাস্ক্রিপ্ট অবজেক্ট উত্তরাধিকারী, আপনি স্পষ্টভাবে এটি নাল সঙ্গে তার প্রোটোটাইপ হিসেবে তৈরি যদি না, মত: Object.create(null)।
{}পরিবর্তে সমতুল্য হবে Object.create(Object.prototype)।
ক্রোম ডিভটোলে আপনি দেখতে পাচ্ছেন যে Object.create(null)এর কোনও __proto__সম্পত্তি {}নেই while
তারা অবশ্যই সমতুল্য নয়। আমি কেন এই পার্থক্য তৈরি করে তা পুরোপুরি ব্যাখ্যা করার জন্য এই উত্তরটি লিখছি।
var p = {};
বৈশিষ্ট্য এবং পদ্ধতি উত্তরাধিকারসূত্রে প্রাপ্ত এমন একটি বস্তু তৈরি করে Object।
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)।
Object.create(null)। আমি এরকম অনুমান না করা পছন্দ করি, এমনকি যদি আপনি এটির ব্যবহারে একেবারে সঠিক হয়ে থাকেন Object.create(null)তবে কোডটি পরিবর্তন হতে পারে, অবজেক্টটি কোনও এক জায়গায় উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে Object। hasOwnPropertyসর্বদা কাজ করে।
{}অপেক্ষা রাখে না Object.create(null)যে এর চেয়ে বেশি প্রচলিত যে , যদি আপনার কোডটি ঘটনাক্রমে এই সময়ে উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিটি ধরে নেয় তবে আপনার চিন্তার উপায় সম্ভবত বড় বড় বাগ রয়েছে। আমি কেবল লোককে অপ্রয়োজনীয় অপ্টিমাইজেশন হিসাবে Object.create (নাল) ব্যবহার করে দেখতে পাচ্ছি।
!!p[key]সঙ্গে ভাল কাজ করে Object.create(null)। তবে hasKey = (key, input) => Object.prototype.hasOwnProperty.call(input, key)হয় না খারাপ
pকারণ প্রতিটি পদ্ধতি sertedোকানো যেতে পারে এবং তাই নিরাপদ হয়ে উঠতে পারে না।
ব্যবহার করে {}অবজেক্ট তৈরি করা এমন একটি বস্তু তৈরি করবে যার প্রোটোটাইপ Object.prototypeযা Objectপ্রোটোটাইপ থেকে মৌলিক ফাংশনগুলির উত্তরাধিকার সূত্রে ব্যবহার করে অবজেক্ট তৈরি Object.create(null)করার সময় একটি ফাঁকা অবজেক্ট তৈরি করবে যার প্রোটোটাইপ নাল।
যদি কেউ বাস্তবায়নের সন্ধান করে তবে 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;
}
দ্রষ্টব্য : আমি কৌতূহল ছাড়াই এটি লিখেছি এবং এটি কেবল সহজ ভাষায় লেখা হয়েছে উদাহরণস্বরূপ, আমি সম্পত্তি বিবরণকারীকে দ্বিতীয় বস্তু থেকে রিটার্ন অবজেক্টে স্থানান্তর করছি না।
__proto__এখন আনুষ্ঠানিকভাবে ভাষার অংশ হয়ে যাবে।
-1এ arguments.length>0?arguments[0]:-1;?
Objectপ্রথম যুক্তি না দেওয়া হয় তবে প্রোটোটাইপটি ধরে রাখা যায়। পরিবর্তনশীল নামগুলি এখানে আরও ভাল হতে পারে।
আপনি যখন Object.create (নাল) দিয়ে একটি অবজেক্ট তৈরি করেন তার অর্থ আপনি কোনও প্রোটোটাইপ ছাড়াই একটি অবজেক্ট তৈরি করছেন। নাল এখানে প্রোটোটাইপ শৃঙ্খলার শেষ মানে। তবুও আপনি যখন object like অবজেক্ট প্রোটোটাইপের মতো কোনও বিষয় তৈরি করবেন তখন যুক্ত হবে। সুতরাং এটি দুটি পৃথক বস্তু, একটি প্রোটোটাইপ সহ প্রোটোটাইপ ছাড়াই। এটি সাহায্য করে ope
if (someKey in p) {