ECMAScript 6 ক্লাসে গিটার এবং সেটটারগুলি কী কী?


102

ECMAScript 6 ক্লাসে getters এবং setters এর বিন্দুটি কী তা নিয়ে আমি বিভ্রান্ত। উদ্দেশ্য কি? নীচে আমি উল্লেখ করছি একটি উদাহরণ:

class Employee {

    constructor(name) {
        this._name = name;
    }

    doWork() {
        return `${this._name} is working`;
    }

    get name() {
        return this._name.toUpperCase();
    }

    set name(newName){
        if(newName){ 
            this._name = newName;
        }
    }
}

1
এটি সি # এর মতোই, যদি আপনি এটি সম্পর্কে জানেন তবে।
আর্তুরো টরেস সানচেজ


এটির ব্যাখ্যা দেওয়ার জন্য ভাল নিবন্ধটি এখানে পাওয়া যাবে: coryrylan.com/blog/javascript-es6-class-syntax "উপরের আমাদের ক্লাসে আমাদের নামের সম্পত্তির জন্য একটি গেটর এবং সেটার রয়েছে a আমরা একটি ব্যাকিং ফিল্ড তৈরি করতে '_' কনভেনশন ব্যবহার করি আমাদের নামের সম্পত্তি সংরক্ষণ করার জন্য। প্রতিটি বার এটি পেতে বা সেট বলা হয় এটি স্ট্যাকের ওভারফ্লোতে কারণ হয়ে দাঁড়ায় "... এটি ভেরিয়েবলকে সত্যিকার অর্থেই 'প্রাইভেট' না বলে কথা বলে, তবে প্রাইভেট ভার তৈরি করার বিভিন্ন নতুন উপায় রয়েছে জেএস ক্লাস; আমার প্রিয় কেবল টাইপস্ক্রিপ্ট ব্যবহার করছে, তবে আমি সিম্বল
পদ্ধতিরও

উত্তর:


108

এই সেটার এবং গেটর আপনাকে সরাসরি সম্পত্তি ব্যবহার করতে দেয় (প্রথম বন্ধনী ব্যবহার না করে)

var emp = new Employee("TruMan1");

if (emp.name) { 
  // uses the get method in the background
}

emp.name = "New name"; // uses the setter in the background

এটি কেবল সম্পত্তিটির মান সেট করা এবং পেতে।


1
আপনি বৈশিষ্ট্য পরিবর্তে সম্পত্তি বলতে চেয়েছিলেন? বিট আমার জন্য বিভ্রান্তিকর
ক্রিজু

ভাল চোখ, ক্রিজু। জাভাস্ক্রিপ্টে বৈশিষ্ট্য বিদ্যমান এবং বৈশিষ্ট্যের চেয়ে সম্পূর্ণ আলাদা জিনিস। উত্তরটি প্রকৃতপক্ষে বৈশিষ্ট্যগুলিকে নয় বরং বৈশিষ্ট্যগুলিকে বোঝায়। আমি উত্তর সম্পাদনা করেছি। আমি মনে করি না যে উত্তরদাতা মনে করবেন। :)
রায় তোয়াল

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

আপনি যদি সেটারে একাধিক পরামিতিগুলি পাস করতে পারেন তবে তা কীভাবে ব্যবহার করবেন? @ ডেভিড লেবার্জ
এস

আপনি যদি নিজে সেটর এবং গেটার তৈরি করতে চান তবে এখানে coryrylan.com/blog/javascript-es6-class-syntax সেট থেকে একটি ভাল উদাহরণ রয়েছে : set name(newName) { this._name = newName; }পান:get name() { return this._name.toUpperCase(); }
জিম ডয়েল

48

ES6 এ প্রাপ্তদের এবং সেটাররা ES5 সহ অন্যান্য ভাষায় যেভাবে কাজ করে সেভাবে করে। ES5 ইতিমধ্যে getters এবং সেটারদের মাধ্যমে মঞ্জুরি দেয় Object.defineProperty, যদিও তারা ব্যবহারের তুলনায় কম পরিচ্ছন্ন এবং আরও জটিল।

কার্যকরভাবে, গেটার্স এবং সেটটারগুলি আপনাকে পাঠ্য ও লেখার জন্য প্রমিত সম্পত্তি অ্যাক্সেস স্বরলিপি ব্যবহার করার অনুমতি দেয় এবং প্রয়োজনীয় স্পষ্টভাবে প্রাপ্তি এবং সেটটার পদ্ধতি ছাড়াই কীভাবে সম্পত্তি পুনরুদ্ধার এবং রূপান্তরিত করা যায় তা কাস্টমাইজ করার ক্ষমতা রাখে।

উপরের কর্মচারী শ্রেণিতে, এর অর্থ হ'ল আপনি nameএই ধরণের সম্পত্তি অ্যাক্সেস করতে পারবেন :

console.log(someEmployee.name);

এটি কোনও সাধারণ সম্পত্তি অ্যাক্সেসের মতো দেখায় , তবে এটি toUpperCaseফেরত দেওয়ার আগে নামটি ডাকবে । একইভাবে, এটি করছেন:

someEmployee.name = null;

সেটারটি অ্যাক্সেস করতে পারে এবং এটির সেটারে _nameপ্রহরী ধারাটি চালু হওয়ার কারণে এটি অভ্যন্তরীণ সম্পত্তিটি পরিবর্তন করতে পারে না name

সাধারণ প্রশ্নটিও দেখুন কেন গেটার এবং সেটটার ব্যবহার করেন? সদস্য অ্যাক্সেসের কার্যকারিতা পরিবর্তন করতে সক্ষম হওয়া সম্পর্কে আরও তথ্যের জন্য দরকারী।


3

ES6 getters এবং setters জাভা অনুরূপ ধারণা তুলনায় যথেষ্ট আলাদা প্রেরণা আছে।

জাভাতে, গ্রাহকরা এবং সেটটাররা একটি শ্রেণিকে জাভাবিয়ান সংজ্ঞায়িত করার অনুমতি দেয়। গেটার্স এবং সিটারগুলির মূল বিষয়টি হ'ল এটি শিমটি পাবলিক ফিল্ডগুলির দ্বারা বোঝানো থেকে সম্পূর্ণ orthogonal "ইন্টারফেস" পেতে দেয় have সুতরাং আমার কাছে এমন একটি ক্ষেত্রের "নাম" থাকতে পারে যা জাভাবিয়ান সম্পত্তি নয়, এবং আমার কাছে জাভাবিয়ান সম্পত্তি "ঠিকানা" থাকতে পারে যা ক্ষেত্র নয়।

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

গেটার্স এবং সেটটারগুলি, ফাংশন হওয়ার কারণে এর মানও রয়েছে যে তারা বাস্তবায়নটিকে "বিমূর্ত" করে। এটি কোনও ক্ষেত্র বা গণিত ("সিন্থেটিক") মান হতে পারে। সুতরাং আমার কাছে যদি "জিপকোড" নামে একটি বিনের সম্পত্তি থাকে তবে এটি স্ট্রিং স্ট্রিং হিসাবে শুরু হয়। এখন ধরা যাক আমি এটিকে ঠিকানা / শহর / রাজ্য থেকে গুণিত মান হিসাবে পরিবর্তন করতে চাই?

যদি আমি কোনও ক্ষেত্র ব্যবহার করি তবে এই কোডটি বিরতি দেয়:

      String zipcode = address.zipcode();

তবে আমি যদি গেটর ব্যবহার করি তবে এটি ভাঙবে না:

      String zipcode = address.getZipcode();

জাভাস্ক্রিপ্ট জাভাবিংস মত কিছুই নেই। যতক্ষণ না আমি পড়েছি, জিইটি এবং এসইটি-র উদ্দেশ্যে মানটি পূর্বোক্ত "সিন্থেটিক" (গণিত) বৈশিষ্ট্যে সীমাবদ্ধ।

তবে এটি জাভার চেয়ে কিছুটা ভাল, যখন জাভা আপনাকে কোনও "ক্ষেত্র" কে কোনও পদ্ধতিতে রূপান্তর করতে দেয় না, ES6 GET এবং SET এটির অনুমতি দেয়।

তা হ'ল, যদি আমার থাকে:

       var zipcode = address.zipcode;

যদি আমি জিপকোডকে কোনও স্ট্যান্ডার্ড অবজেক্ট প্রোপার্টি থেকে একজন গেটরে পরিণত করি তবে উপরের কোডটি এখন জিইটি ফাংশনটিকে কল করে।

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

সুতরাং আমি মনে করি এটি বেটউইন জাভা এবং জাভাস্ক্রিপ্ট ইএস 6 গেটরস এবং সেটটারগুলি বোঝার জন্য কিছু গুরুত্বপূর্ণ পার্থক্য।


0
class Employee {

    constructor(name) {
      this._name = name;
    }

    doWork() {
      return `${this._name} is working`;
    }

    get name() {
      // when you get this by employeeInstance.mame
      // the code below will be triggered
      // and you can do some logic here
      // just like `console.log` something you want
      console.log('get triggered!')
      return this._name.toUpperCase();
    }

    set name(newName) {
      // the same as `get`
      // when you employeeInstance.mame = 'xxx'
      // the code blew will be trigged
      // and you can also do some logic 
      // like here is a `console.log` and `if check`
      console.log('set triggered!')
      if (newName) {
        this._name = newName;
      }
    }
  }

  const employeeInstance = new Employee('mike')
  employeeInstance.name
  employeeInstance.name = '' // this won't be success, because the `if check`
  console.log(employeeInstance.name)

  // => 
  // get triggered
  // set triggered
  // get triggered
  // MIKE

যাইহোক getterএবং setterঠিক একটি গুপ্তচর মত। এটি কোনও সামগ্রীর সম্পত্তি গুপ্তচরবৃত্তি করে, যাতে আপনি যখনই সম্পত্তিটির মূল্য পান বা সেট করেন তখন আপনি কিছু করতে পারেন।

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