@ লোগানফস্মিথের উত্তরে প্রসারিত করতে:
জাভাস্ক্রিপ্টের একমাত্র সত্যিকারের ব্যক্তিগত ডেটা এখনও স্কেপড ভেরিয়েবল। অভ্যন্তরীণভাবে পাবলিক প্রোপার্টি হিসাবে একইভাবে অ্যাক্সেস করা সম্পত্তি হিসাবে আপনি ব্যক্তিগত সম্পত্তি রাখতে পারবেন না তবে আপনি ব্যক্তিগত ডেটা সঞ্চয় করতে স্কোপড ভেরিয়েবল ব্যবহার করতে পারেন।
স্কোপড ভেরিয়েবল
এখানে পদ্ধতিরটি হ'ল কনস্ট্রাক্টর ফাংশনের স্কোপটি প্রাইভেট ডেটা সংরক্ষণ করার জন্য ব্যবহার করা। পদ্ধতিগুলিতে এই ব্যক্তিগত ডেটাতে অ্যাক্সেস পাওয়ার জন্য সেগুলি অবশ্যই নির্মাণকারীর মধ্যেই তৈরি করতে হবে, অর্থাত আপনি তাদের প্রতিটি ইভেন্টের সাথে পুনরায় তৈরি করছেন। এটি একটি পারফরম্যান্স এবং মেমরির জরিমানা, তবে কেউ কেউ বিশ্বাস করেন যে এই দণ্ডটি গ্রহণযোগ্য। প্রোটোটাইপটিতে যথারীতি যুক্ত করে ব্যক্তিগত ডেটাতে অ্যাক্সেসের প্রয়োজন না এমন পদ্ধতির জন্য জরিমানা এড়ানো যেতে পারে।
উদাহরণ:
function Person(name) {
let age = 20; // this is private
this.name = name; // this is public
this.greet = function () {
// here we can access both name and age
console.log(`name: ${this.name}, age: ${age}`);
};
}
let joe = new Person('Joe');
joe.greet();
// here we can access name but not age
Scoped WeakMap
পূর্ববর্তী পদ্ধতির কর্মক্ষমতা এবং মেমরির জরিমানা এড়াতে একটি WeakMap ব্যবহার করা যেতে পারে। WeakMaps অবজেক্টের সাথে ডেটা সংযুক্ত করে (এখানে উদাহরণস্বরূপ) যাতে কেবলমাত্র সেই WeakMap ব্যবহার করে অ্যাক্সেস করা যায়। সুতরাং, আমরা একটি ব্যক্তিগত ওয়েকম্যাপ তৈরি করতে স্কোপযুক্ত ভেরিয়েবল পদ্ধতিটি ব্যবহার করি, তারপরে এর সাথে সম্পর্কিত ব্যক্তিগত ডেটা পুনরুদ্ধারে সেই WeakMap ব্যবহার করি this
। এটি স্কোপড ভেরিয়েবল পদ্ধতির চেয়ে দ্রুততর কারণ আপনার সমস্ত দৃষ্টান্ত একটি একক উইকম্যাপ ভাগ করে নিতে পারে, তাই কেবল তাদের নিজস্ব ওয়েকম্যাপগুলিতে অ্যাক্সেস তৈরি করার জন্য আপনাকে পদ্ধতিগুলি পুনরায় তৈরি করতে হবে না।
উদাহরণ:
let Person = (function () {
let privateProps = new WeakMap();
class Person {
constructor(name) {
this.name = name; // this is public
privateProps.set(this, {age: 20}); // this is private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${privateProps.get(this).age}`);
}
}
return Person;
})();
let joe = new Person('Joe');
joe.greet();
// here we can access joe's name but not age
এই উদাহরণটি একাধিক ব্যক্তিগত সম্পত্তিগুলির জন্য একটি ওয়েকম্যাপ ব্যবহার করতে একটি অবজেক্ট ব্যবহার করে; আপনি একাধিক WeakMaps ব্যবহার করতে পারেন এবং তাদের পছন্দ মতো ব্যবহার করতে পারেন age.set(this, 20)
, বা একটি ছোট মোড়ক লিখতে এবং এটি অন্যভাবে ব্যবহার করতে পারেন, পছন্দ করুন privateProps.set(this, 'age', 0)
।
এই পদ্ধতির গোপনীয়তা তাত্ত্বিকভাবে গ্লোবাল WeakMap
অবজেক্টের সাথে হস্তক্ষেপের মাধ্যমে লঙ্ঘন হতে পারে । এটি বলেছিল যে সমস্ত জাভাস্ক্রিপ্ট ম্যাংড গ্লোবালগুলি দ্বারা ভেঙে যেতে পারে। আমাদের কোডটি ইতিমধ্যে এই ধারনাটিতে তৈরি করা হয়েছে যে এটি হচ্ছে না।
(এই পদ্ধতিটি দিয়েও করা যেতে পারে Map
তবে WeakMap
এটি আরও ভাল কারণ Map
আপনি খুব যত্নবান না হলে মেমরি ফাঁস তৈরি করবে এবং এই উদ্দেশ্যে দুটি অন্যথায় আলাদা না হয় different)
অর্ধ-উত্তর: স্কোপড প্রতীকগুলি
একটি প্রতীক একটি ধরণের আদিম মান যা কোনও সম্পত্তির নাম হিসাবে পরিবেশন করতে পারে। আপনি একটি ব্যক্তিগত প্রতীক তৈরি করতে স্কোপযুক্ত ভেরিয়েবল পদ্ধতিটি ব্যবহার করতে পারেন, তারপরে ব্যক্তিগত ডেটা সঞ্চয় করতে পারেন this[mySymbol]
।
এই পদ্ধতির গোপনীয়তাটি ব্যবহার করে লঙ্ঘন করা যায় Object.getOwnPropertySymbols
তবে এটি করা কিছুটা বিশ্রী।
উদাহরণ:
let Person = (function () {
let ageKey = Symbol();
class Person {
constructor(name) {
this.name = name; // this is public
this[ageKey] = 20; // this is intended to be private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${this[ageKey]}`);
}
}
return Person;
})();
let joe = new Person('Joe');
joe.greet();
// Here we can access joe's name and, with a little effort, age. ageKey is
// not in scope, but we can obtain it by listing all Symbol properties on
// joe with `Object.getOwnPropertySymbols(joe)`.
অর্ধ-উত্তর: বোঝে
পুরানো ডিফল্ট, কেবল একটি আন্ডারস্কোর উপসর্গ সহ একটি সর্বজনীন সম্পত্তি ব্যবহার করুন। যদিও কোনও উপায়ে ব্যক্তিগত সম্পত্তি না হলেও এই সম্মেলনটি যথেষ্ট প্রচলিত যে এটি একটি ভাল কাজ করে যা পাঠকদের সেই সম্পত্তিটিকে ব্যক্তিগত হিসাবে বিবেচনা করা উচিত, যা প্রায়শই কাজটি হয়ে যায়। এই ল্যাপসটির বিনিময়ে, আমরা এমন একটি পন্থা পাই যা পড়া সহজ, টাইপ করা সহজ এবং দ্রুত।
উদাহরণ:
class Person {
constructor(name) {
this.name = name; // this is public
this._age = 20; // this is intended to be private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${this._age}`);
}
}
let joe = new Person('Joe');
joe.greet();
// Here we can access both joe's name and age. But we know we aren't
// supposed to access his age, which just might stop us.
উপসংহার
ES2017 হিসাবে, এখনও ব্যক্তিগত সম্পত্তিগুলি করার কোনও সঠিক উপায় নেই। বিভিন্ন পদ্ধতির বিভিন্ন উপকারিতা রয়েছে cons স্কোপড ভেরিয়েবলগুলি সত্যই ব্যক্তিগত; স্কোপড ওয়েকম্যাপগুলি স্কোপড ভেরিয়েবলের চেয়ে খুব ব্যক্তিগত এবং আরও ব্যবহারিক; স্কোপযুক্ত প্রতীকগুলি যথাযথভাবে ব্যক্তিগত এবং যুক্তিসঙ্গতভাবে ব্যবহারিক; আন্ডারস্কোরগুলি প্রায়শই যথেষ্ট ব্যক্তিগত এবং খুব ব্যবহারিক।