সম্পত্তি বর্ণনাকারী

বস্তুর বৈশিষ্ট্যগুলির সাথে আপনার বেশিরভাগ মিথস্ক্রিয়া সম্ভবত পৃষ্ঠ-স্তরের হবে, যার মধ্যে অবজেক্ট লিটারাল তৈরি করা এবং কী ব্যবহার করে সম্পত্তির মান সেট করা এবং অ্যাক্সেস করা সহ। যাইহোক, আপনি অভ্যন্তরীণভাবে একটি বস্তুর যেকোন সম্পত্তি কনফিগার করতে পারেন যাতে সেই বৈশিষ্ট্যগুলি কীভাবে অ্যাক্সেস করা হয়, পরিবর্তিত হয় এবং সংজ্ঞায়িত করা হয় তার উপর সূক্ষ্ম নিয়ন্ত্রণের জন্য। প্রতিটি বস্তুর সম্পত্তিতে সেই সম্পত্তির সাথে সম্পর্কিত মেটাডেটা ধারণকারী অদৃশ্য বৈশিষ্ট্যগুলির একটি সেট থাকে, যাকে বলা হয় "সম্পত্তি বর্ণনাকারী"।

যেকোনো সম্পত্তির সাথে যুক্ত দুই ধরনের বর্ণনাকারী আছে: ডেটা বর্ণনাকারী এবং অ্যাক্সেসর বর্ণনাকারী । একটি ডেটা বর্ণনাকারীর মধ্যে কী এবং মান জোড়া রয়েছে যা একটি সম্পত্তির মান ধারণ করে, সেই মান লিখনযোগ্য, কনফিগারযোগ্য বা গণনাযোগ্য কিনা তা নির্বিশেষে। অ্যাকসেসর বর্ণনাকারীতে এমন ফাংশন থাকে যা প্রপার্টি সেট করা, পরিবর্তন করা বা অ্যাক্সেস করার সময় কার্যকর করা হয়।

সম্পত্তি বর্ণনাকারীর ধরন থেকে ডিফল্ট মান
Object.defineProperty()
বর্ণনা
[[Value]] ডেটা undefined একটি সম্পত্তির মান রয়েছে।
[[Writable]] ডেটা false আপনি সম্পত্তির মান পরিবর্তন করতে পারবেন কিনা তা নির্ধারণ করে।
[[Get]] অ্যাক্সেসর undefined প্রপার্টির গেটার ফাংশন, যা প্রপার্টি অ্যাক্সেস করার সময় এক্সিকিউট করে।
[[Set]] অ্যাক্সেসর undefined প্রপার্টির সেটার ফাংশন, যা প্রপার্টি সেট বা পরিবর্তন করা হলে এক্সিকিউট করে।
[[Configurable]] উভয় false যদি এটি false হয়, সম্পত্তিটি মুছে ফেলা যাবে না এবং এর বৈশিষ্ট্যগুলি পরিবর্তন করা যাবে না। যদি এটি false হয় এবং [[Writable]] true হয়, তবে সম্পত্তির মান পরিবর্তন করা যেতে পারে।
[[Enumerable]] উভয় false যদি এটি true হয়, আপনি for...in loops বা Object.keys() স্ট্যাটিক পদ্ধতি ব্যবহার করে সম্পত্তির উপর পুনরাবৃত্তি করতে পারেন।

এই বৈশিষ্ট্যগুলির প্রত্যেকটি [[Prototype]] এর মতো একই শর্টহ্যান্ড ব্যবহার করে, যা নির্দেশ করে যে এই বৈশিষ্ট্যগুলি সরাসরি অ্যাক্সেস করার জন্য নয়। পরিবর্তে, অবজেক্টের বৈশিষ্ট্য সংজ্ঞায়িত বা পরিবর্তন করতে Object.defineProperty() স্ট্যাটিক পদ্ধতি ব্যবহার করুন। Object.defineProperty() তিনটি আর্গুমেন্ট গ্রহণ করে: যে অবজেক্টে কাজ করতে হবে, প্রপার্টি কী তৈরি বা পরিবর্তন করা হবে এবং একটি অবজেক্ট যার মধ্যে বর্ণনাকারী(গুলি) আছে যেটি প্রোপার্টি তৈরি বা পরিবর্তন করা হচ্ছে তার সাথে যুক্ত।

ডিফল্টরূপে, Object.defineProperty() ব্যবহার করে তৈরি করা বৈশিষ্ট্য লিখনযোগ্য, গণনাযোগ্য বা কনফিগারযোগ্য নয়। যাইহোক, আপনি বস্তুর আক্ষরিক অংশ হিসাবে বা ডট বা বন্ধনী স্বরলিপি ব্যবহার করে তৈরি যে কোনো সম্পত্তি লিখনযোগ্য, গণনাযোগ্য এবং কনফিগারযোগ্য।

const myObj = {};

Object.defineProperty(myObj, 'myProperty', {
  value: true,
  writable: false
});

myObj.myProperty;
> true

myObj.myProperty = false;

myObj.myProperty;
> true

উদাহরণস্বরূপ, যখন [[Writable]] এর একটি false মান থাকে, তখন সংশ্লিষ্ট সম্পত্তির জন্য একটি নতুন মান সেট করার চেষ্টা কঠোর মোডের বাইরে নীরবে ব্যর্থ হয় এবং কঠোর মোডে একটি ত্রুটি ছুড়ে দেয়:

{
    const myObj = {};

    Object.defineProperty(myObj, 'myProperty', {
    value: true,
    writable: false
    });

    myObj.myProperty = false;
    myObj.myProperty;
}
> true

(function () {
    "use strict";
    const myObj = {};

    Object.defineProperty(myObj, 'myProperty', {
    value: true,
    writable: false
    });

    myObj.myProperty = false;
    myObj.myProperty;
}());\
> Uncaught TypeError: "myProperty" is read-only

বর্ণনাকারীর কার্যকর ব্যবহার করা একটি মোটামুটি উন্নত ধারণা, কিন্তু বস্তুর সাথে কাজ করার সাথে জড়িত বাক্য গঠনগুলি বোঝার জন্য একটি বস্তুর অভ্যন্তরীণ গঠন বোঝা অপরিহার্য। উদাহরণস্বরূপ, Object.create() স্ট্যাটিক পদ্ধতি ব্যবহার করার সময় এই ধারণাগুলি কার্যকর হয়, যা আপনাকে নতুন অবজেক্টের সাথে সংযুক্ত যেকোনো প্রোটোটাইপের উপর সূক্ষ্ম নিয়ন্ত্রণ দেয়।

Object.create() একটি নতুন অবজেক্ট তৈরি করে যার প্রোটোটাইপ হিসাবে বিদ্যমান একটি অবজেক্ট ব্যবহার করে। এটি নতুন অবজেক্টকে অন্য ব্যবহারকারী-নির্ধারিত অবজেক্টের বৈশিষ্ট্য এবং পদ্ধতিগুলিকে একইভাবে উত্তরাধিকার দেয় যেভাবে অবজেক্টগুলি জাভাস্ক্রিপ্টের অন্তর্নির্মিত Object প্রোটোটাইপ থেকে বৈশিষ্ট্যগুলি প্রাপ্ত করে। আপনি যখন একটি বস্তুর সাথে Object.create() একটি আর্গুমেন্ট হিসাবে আমন্ত্রণ জানান, তখন এটি একটি খালি অবজেক্ট তৈরি করে যার প্রোটোটাইপ হিসাবে পাস করা অবজেক্টের সাথে।

const myCustomPrototype = {
  'myInheritedProp': 10
};

const newObject = Object.create( myCustomPrototype );

newObject;
> Object {  }
<prototype>: Object { myInheritedProp: 10 }
  myInheritedProp: 10
  <prototype>: Object { … }

Object.create Object.defineProperty() এর অনুরূপ একটি সিনট্যাক্স ব্যবহার করে নতুন-নির্মিত অবজেক্টের জন্য নিজস্ব বৈশিষ্ট্য নির্দিষ্ট করে একটি দ্বিতীয় আর্গুমেন্ট নিতে পারে - অর্থাৎ, বর্ণনাকারী বৈশিষ্ট্যগুলির একটি সেটে একটি অবজেক্ট ম্যাপিং কী:

const myCustomPrototype = {
  'myInheritedProp': 10
};

const myObj = Object.create( myCustomPrototype, {
        myProperty: {
            value: "The new property value.",
            writable: true,
            configurable: true
        }
  });

myObj;
> Object { … }
    myProperty: "The new property value."
    <prototype>: Object { myInheritedProp: 10 }

এই উদাহরণে, নতুন অবজেক্ট ( myObj ) তার প্রোটোটাইপ হিসাবে একটি অবজেক্ট আক্ষরিক ( myCustomPrototype ) ব্যবহার করে, যা নিজেই উত্তরাধিকারসূত্রে প্রাপ্ত Object.prototype ধারণ করে, যার ফলে উত্তরাধিকারসূত্রে প্রাপ্ত প্রোটোটাইপগুলির একটি সিরিজ যাকে প্রোটোটাইপ চেইন বলা হয়। প্রতিটি বস্তুর একটি প্রোটোটাইপ আছে, তা বরাদ্দ করা বা উত্তরাধিকারসূত্রে প্রাপ্ত, যার নিজস্ব একটি বরাদ্দ বা উত্তরাধিকারসূত্রে প্রাপ্ত প্রোটোটাইপ রয়েছে। এই চেইনটি একটি null প্রোটোটাইপে শেষ হয়, যার নিজস্ব কোনো প্রোটোটাইপ নেই।

const myPrototype = {
  'protoProp': 10
};

const newObject = Object.setPrototypeOf( { 'objProp' : true }, myPrototype );

newObject;
> Object { objProp: true }
    objProp: true
    <prototype>: Object { protoProp: 10 }
        protoProp: 10
        <prototype>: Object { … }

একটি মানের প্রোটোটাইপে থাকা বৈশিষ্ট্যগুলি একটি বস্তুর "শীর্ষ স্তরে" উপলব্ধ, প্রোটোটাইপ সম্পত্তি সরাসরি অ্যাক্সেস করার প্রয়োজন ছাড়াই:

const objectLiteral = {
    "value" : true
};

objectLiteral;
> Object { value: true }
    value: true
    <prototype>: Object { … }

objectLiteral.toString();
"[object Object]"

এই প্যাটার্নটি একটি বস্তুর সাথে সম্পৃক্ত সমগ্র প্রোটোটাইপ চেইনের জন্য সত্য ধারণ করে: একটি সম্পত্তি অ্যাক্সেস করার চেষ্টা করার সময়, দোভাষী প্রোটোটাইপ চেইনের প্রতিটি "স্তরে" উপরের থেকে নীচে পর্যন্ত সেই সম্পত্তিটি সন্ধান করে, যতক্ষণ না এটি সম্পত্তি বা চেইন খুঁজে পায়। শেষ:

const myCustomPrototype = {
  'protoProp': "Prototype property value."
};

const myObj = Object.create( myCustomPrototype, {
    myProperty: {
        value: "Top-level property value.",
        writable: true,
        configurable: true
    }
});

myObj.protoProp;
> "Prototype property value."

আপনার উপলব্ধি পরীক্ষা করুন

কোন বর্ণনাকারী অ্যাক্সেসর?

[[Get]]
[[Set]]
[[Writable]]