জাভাস্ক্রিপ্টে কেন (সুপার .__ প্রোটো__ === এটি __ প্রোটো__) সত্য?


10

দেখে মনে হচ্ছে জাভাস্ক্রিপ্ট (ES6) ক্লাসে super.__proto__ === this.__proto__

কেন আপনি বিষয়টি ব্যাখ্যা করতে পারেন? আচরণটি বিভিন্ন ব্রাউজার জুড়ে সামঞ্জস্যপূর্ণ বলে মনে হয়, তাই আমার সন্দেহ হয় এটি অনুমানের কোথাও নির্দিষ্ট করা আছে।

নিম্নলিখিত কোড বিবেচনা করুন:

class Level1 {
    myFunc() {
        console.log('Level1');
    }
}

class Level2 extends Level1 {
    myFunc() {
        console.log('Level2');
    }
}

class Level3 extends Level2 {
    myFunc() {
        console.log('Level3 BEGIN ' + Math.random()); 
        super.__proto__.myFunc();
        console.log(super.__proto__ === this.__proto__);
        console.log('Level3 END'); 
    }
}

const foo = new Level3();
foo.myFunc();

আমি প্রত্যাশা করতাম যে ক্লাসের super.__proto__.myFunc();ফাংশন এবং এটি কল করবে । পরিবর্তে প্রকৃতপক্ষে শ্রেণীর কল (এটি নিজে কল করে) এবং তারপরে দ্বিতীয় আবেদনে এটি ক্লাসের ডাক দেয় । এই পুরোপুরি বোধগম্য যদি যা কোড প্রমান।myFunc()Level1super.__proto__ !== this.__proto__super.__proto__.myFunc();myFunc()Level3myFunc()Level2super.__proto__ === this.__proto__

আপনি super.__proto__ === this.__proto__এই উদাহরণের কারণ ব্যাখ্যা করতে পারেন ? যদি সম্ভব হয় তবে অনুমানের সম্পর্কিত বিভাগটিকেও সরবরাহ করুন।

উত্তর:


6

Object.prototype.__proto__গেটারের সাথে সম্পত্তি [1] । এটি তার thisমান নিয়ে কাজ করে । মান superহওয়ার কোনও সত্যিকারের অবজেক্ট নেই this(আপনি লিখতে পারেননি Object.getPrototypeOf(super)), কেবলমাত্র superসম্পত্তি অনুসন্ধানের উপায়, তাই this.__proto__এবং super.__proto__একই জিনিসটির অর্থ যতক্ষণ __proto__না প্রোটোটাইপ শৃঙ্খলে নীচে কোথাও সংজ্ঞায়িত হয় না।

তুলনা করা:

class Parent {
    get notProto() {
        return this instanceof Child;
    }
}

class Child extends Parent {
    test() {
        console.log(super.notProto);
    }
}

new Child().test();

// bonus: [1]
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));


আমি ইতিমধ্যে সন্দেহ করেছিলাম যে এটির __proto__অ্যাক্সেসর ফাংশনগুলি হ'ল Object.prototypeএবং তাদের thisমানটি চালিয়ে যাওয়ার সাথে এটির কিছু ছিল । তবে আমি কেবল এটি কল্পনা করতে পারি নি যে superএইভাবে কাজ করার জন্য এটি নির্দিষ্ট করা হয়েছিল। আমি চিন্তা superমোটামুটিভাবে সমতূল্য হচ্ছে this.__proto__.__proto__, তাই super.__proto__সমতুল্য হতো this.__proto__.__proto__.__proto__যা আচরণ আমি আশা করেছিলাম বিকশিত হবে। আপনি কি জানেন, যেখানে superনির্দিষ্ট জায়গায় সঠিক আচরণ নির্দিষ্ট করা হয়েছে?
জেনস মোসার

@ জেনসমোজার: আমি এটি কিছুটা খুঁজে পাব, তবে এর superমতো সাধারণ ব্যবহারগুলি কল্পনা করব super.setFoo('bar')। আপনি উদাহরণটির পরিবর্তে কোনও প্রোটোটাইপে অপারেটিং চাইবেন না।
রাই-

@ জর্জি আমি জানি এটি __proto__একটি এক্সেসরের সম্পত্তি Object.prototype। আমি যখন অনুমানের জন্য একটি রেফারেন্স চেয়েছি, আমি superএর সাথে মিলিয়ে কীওয়ার্ডটির সঠিক আচরণের একটি রেফারেন্স বুঝি __proto__। আমার আগের মন্তব্য দেখুন।
জেনস মোসার

@ রাই- হ্যাঁ, আমি কিছুটা সরলীকৃত করেছি। আমার সঠিক বুঝতে super.setFoo('bar')হবে যে এটি সমতুল্য this.__proto__.__proto__.setFoo.call(this, 'bar')। সুতরাং, superস্বয়ংক্রিয়ভাবে সঠিক সঙ্গে ফাংশন প্রার্থনা this
জেনস

1
@ জেনসমোজার super.__proto__( Level3ক্লাসের সেই পদ্ধতিতে ) ঠিক সমানReflect.get(Object.getPrototypeOf(Level3.prototype), "__proto__", this)
বার্গি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.