প্রোটোটাইপাল উত্তরাধিকার

অন্যান্য ডেটা প্রকারের মতো, একটি অবজেক্ট একটি অন্তর্নির্মিত Object প্রোটোটাইপ থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলিকে উত্তরাধিকার সূত্রে প্রাপ্ত করে, যার অর্থ ফলস্বরূপ অবজেক্টে আপনার সংজ্ঞায়িত বৈশিষ্ট্য এবং প্রোটোটাইপ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতিগুলি সমন্বিত একটি প্রোটোটাইপ বৈশিষ্ট্য উভয়ই থাকে:

let myObject = {
    'booleanValue' : true
};

myObject;
> Object { booleanValue: true }
    booleanValue: true
    [[prototype]]: Object { … }
            __defineGetter__: function __defineGetter__()
            __defineSetter__: function __defineSetter__()
            __lookupGetter__: function __lookupGetter__()
            __lookupSetter__: function __lookupSetter__()
            __proto__: …
                constructor: function Object()
                hasOwnProperty: function hasOwnProperty()
                isPrototypeOf: function isPrototypeOf()
                propertyIsEnumerable: function propertyIsEnumerable()
                toLocaleString: function toLocaleString()
                toString: function toString()
                valueOf: function valueOf()
                <get __proto__()>: function __proto__()
                <set __proto__()>: function __proto__()

প্রোটোটাইপ বৈশিষ্ট্যগুলি প্রপার্টি কী দ্বারা সরাসরি অ্যাক্সেস করার উদ্দেশ্যে নয়। আপনি আগের উদাহরণে লক্ষ্য করতে পারেন, এটি ব্রাউজারের ডেভেলপার কনসোলে ব্যবহৃত [[prototype]] বা <prototype> স্বরলিপি এবং প্রোটোটাইপের সম্পত্তি কী-এর জন্য ডকুমেন্টেশনের উত্স দ্বারা উহ্য:

// Chrome:
let emptyObject = {};

emptyObject;
> {}
  [[prototype]]: Object
// Firefox:
let emptyObject = {};

emptyObject;
> Object {  }
  <prototype>: Object { … }

যদিও সমস্ত সাধারণ ব্রাউজার __proto__ একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড হিসাবে ব্যবহার করে, এটি আনুষ্ঠানিকভাবে প্রমিত নয় এবং উত্পাদন কোডে এড়ানো উচিত।

let emptyObject = {};

emptyObject.__proto__;
> Object { … }
    __defineGetter__: function __defineGetter__()
    __defineSetter__: function __defineSetter__()
    __lookupGetter__: function __lookupGetter__()
    __lookupSetter__: function __lookupSetter__()
    __proto__:
        constructor: function Object()
        hasOwnProperty: function hasOwnProperty()
        isPrototypeOf: function isPrototypeOf()
        propertyIsEnumerable: function propertyIsEnumerable()
        toLocaleString: function toLocaleString()
        toString: function toString()
        valueOf: function valueOf()
        <get __proto__()>: function __proto__()
        <set __proto__()>: function __proto__()

পরিবর্তে, আপনি অন্তর্নির্মিত Object.getPrototypeOf() এবং Object.setPrototypeOf() পদ্ধতি ব্যবহার করে একটি বস্তুর [[Prototype]] সরাসরি অ্যাক্সেস এবং পরিবর্তন করতে পারেন:

let myObj = { "value" : 5 };
let protoParent = { "protoValue" : true };

myObj;
Object { value: 5 }
    value: 5
    <prototype>: Object { … }

Object.getPrototypeOf( myObj );
> Object { … }
    __defineGetter__: function __defineGetter__()
    __defineSetter__: function __defineSetter__()
    __lookupGetter__: function __lookupGetter__()
    __lookupSetter__: function __lookupSetter__()
    __proto__:
    constructor: function Object()
    hasOwnProperty: function hasOwnProperty()
    isPrototypeOf: function isPrototypeOf()
    propertyIsEnumerable: function propertyIsEnumerable()
    toLocaleString: function toLocaleString()
    toString: function toString()
    valueOf: function valueOf()
    <get __proto__()>: function __proto__()
    <set __proto__()>: function __proto__()

Object.setPrototypeOf( myObj, protoParent );
> Object { value: 5 }
    value: 5
    <prototype>: Object { protoValue: true }

উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্য এবং লেখক-সংজ্ঞায়িত বৈশিষ্ট্যগুলির মধ্যে পার্থক্য করার জন্য, পরবর্তীটিকে সাধারণত বস্তুর "নিজস্ব বৈশিষ্ট্য" বলা হয়।

বিল্ট-ইন Object.hasOwn() পদ্ধতিটি true দেখায় যদি নির্দিষ্ট প্রপার্টিটি অবজেক্টের সরাসরি সম্পত্তি হয় এবং যদি সম্পত্তিটি উত্তরাধিকারসূত্রে পাওয়া যায় বা বিদ্যমান না থাকে তবে false । যখনই সম্ভব, উত্তরাধিকারসূত্রে প্রাপ্ত hasOwnProperty() পদ্ধতির পরিবর্তে Object.hasOwn() ব্যবহার করুন, যা Object.create() সমর্থন করে না।

let myObject = {
    'myValue' : 100
};

Object.hasOwn( myObject, 'myValue' );
> true

myObject.__proto__; // The Object prototype inherited by `myObject` is present:
> Object { … }

Object.hasOwn( myObject, '__proto__' ); // The Object prototype inherited by `myObject` is not an "own property:"
> false

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

কেন আপনি __proto__ ব্যবহার এড়াতে হবে?

এটা মানসম্মত নয়।
এটি অনেক ব্রাউজার দ্বারা সমর্থিত নয়।
এটি আপনার কোডের ভবিষ্যতের রক্ষণাবেক্ষণকারীদের বিভ্রান্ত করবে।