Symbols ES6 (ECMAScript 2015) তে নতুন একটি primitive data type হিসেবে পরিচিত। এটি অন্য কোনো data type এর মতো নয়, এবং এটি unique এবং immutable (অপরিবর্তনীয়) এক ধরনের মান সৃষ্টি করে। Symbols সাধারণত এক্সপ্লিসিট নামকরণের ক্ষেত্রে ব্যবহৃত হয়, যেখানে আপনি নিশ্চিত হতে চান যে কোনো property বা identifier এর সাথে কনফ্লিক্ট হবে না।
1. Symbol কী?
Symbol হল একটি নতুন primitive type যা Symbol() ফাংশন দ্বারা তৈরি করা হয়। প্রতিটি Symbol ইউনিক এবং অপরিবর্তনীয় (immutable) হয়, অর্থাৎ একবার তৈরি হওয়ার পর সেটি কখনও পরিবর্তন করা যায় না। এটি মূলত অ্যাবস্ট্রাক্ট ইউনিক আইডেন্টিফায়ার (abstract unique identifier) হিসেবে কাজ করে।
উদাহরণ:
const symbol1 = Symbol('description1');
const symbol2 = Symbol('description2');
console.log(symbol1 === symbol2); // false
এখানে, দুটি Symbol তৈরি করা হয়েছে এবং description দুটি আলাদা থাকলেও, এটি দুইটি আলাদা Symbol হওয়ায় তারা সমান নয়।
2. Symbols এর বৈশিষ্ট্য
- Unique: প্রতিটি Symbol আলাদা এবং এটি অন্য Symbol এর সাথে কখনো সমান হয় না।
- Immutable: একবার একটি Symbol তৈরি হলে, সেটি পরিবর্তন করা সম্ভব নয়।
- Hidden Properties: Symbols সাধারণত অবজেক্টের প্রপার্টি হিসেবে ব্যবহৃত হয়, তবে এগুলি সাধারণত enumeration বা iteration এর সময় দৃশ্যমান হয় না।
- Description: Symbol একটি ঐচ্ছিক বর্ণনা গ্রহণ করতে পারে, যা ডিবাগিং প্রক্রিয়ায় সহায়ক হতে পারে।
উদাহরণ:
const symbol = Symbol('description');
console.log(symbol.description); // 'description'
এখানে, symbol.description দিয়ে প্রতিটি Symbol এর একটি বর্ণনা পাওয়া যায়।
3. Symbols ব্যবহার করা
Symbols সাধারণত অবজেক্টের প্রপার্টি নাম হিসেবে ব্যবহৃত হয়। যেহেতু প্রতিটি Symbol ইউনিক, তাই এটি অবজেক্টে এমনকি একই নামের প্রপার্টি তৈরি করতে পারে যা অন্যান্য প্রপার্টির সাথে কনফ্লিক্ট করবে না।
উদাহরণ:
const sym1 = Symbol('id');
const user = {
name: 'Alice',
[sym1]: 123
};
console.log(user[sym1]); // 123
এখানে, sym1 Symbol অবজেক্টের প্রপার্টি হিসেবে ব্যবহার করা হয়েছে। এটি অন্যান্য প্রপার্টি নামের সঙ্গে কনফ্লিক্ট করবে না।
4. Symbols এবং Object.enumeration
Symbols সাধারণত Object.keys(), Object.getOwnPropertyNames(), বা for...in লুপ দ্বারা enumerate (তালিকাভুক্ত) করা হয় না। তবে, Object.getOwnPropertySymbols() দিয়ে আপনি Symbols সহ প্রপার্টি তালিকা পেতে পারেন।
উদাহরণ:
const sym1 = Symbol('id');
const sym2 = Symbol('age');
const user = {
name: 'Alice',
[sym1]: 123,
[sym2]: 30
};
console.log(Object.getOwnPropertyNames(user)); // ["name"]
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(id), Symbol(age)]
এখানে, Object.getOwnPropertySymbols() ব্যবহার করে Symbols এর প্রপার্টি নামগুলো পাওয়া গেছে, কিন্তু Object.getOwnPropertyNames() শুধুমাত্র সাধারণ প্রপার্টি (যেমন "name") ফিরিয়েছে।
5. Global Symbols
ES6 তে একটি নতুন ধারণা যোগ করা হয়েছে, যেটি হল Global Symbols। Symbol.for() এবং Symbol.keyFor() এর মাধ্যমে গ্লোবাল স্পেসে Symbols তৈরি ও অ্যাক্সেস করা সম্ভব।
Symbol.for(): এটি গ্লোবাল স্পেসে একটি Symbol তৈরি বা সন্ধান করে।Symbol.keyFor(): এটি গ্লোবাল Symbol এর জন্য তার key ফেরত দেয়।
উদাহরণ:
const globalSymbol = Symbol.for('globalSymbol');
const globalSymbol2 = Symbol.for('globalSymbol');
console.log(globalSymbol === globalSymbol2); // true
const symbolKey = Symbol.keyFor(globalSymbol);
console.log(symbolKey); // 'globalSymbol'
এখানে, Symbol.for() ব্যবহার করে গ্লোবাল স্পেসে একটি Symbol তৈরি করা হয়েছে এবং Symbol.keyFor() দিয়ে তার key পাওয়া গেছে।
6. Symbols এর ব্যবহার (Use Cases)
- Private properties: Symbols প্রাইভেট প্রপার্টি তৈরি করতে ব্যবহৃত হতে পারে যা বাহ্যিক কোড থেকে অ্যাক্সেসযোগ্য নয়।
- Unique identifiers: Symbols একটি নির্দিষ্ট ইউনিক আইডেন্টিফায়ার হিসেবে কাজ করে যা অন্যান্য অবজেক্টের প্রপার্টি নামের সাথে কনফ্লিক্ট করবে না।
উদাহরণ:
const symbol = Symbol('private');
const obj = {
[symbol]: 'This is a private property'
};
console.log(obj[symbol]); // 'This is a private property'
এখানে, symbol এর মাধ্যমে একটি প্রাইভেট প্রপার্টি তৈরি করা হয়েছে যা অন্য কোন কোডের সাথে কনফ্লিক্ট করবে না।
Symbols ES6 এর একটি শক্তিশালী ফিচার যা কোডের নিরাপত্তা ও অপ্রত্যাশিত কনফ্লিক্ট এড়াতে সাহায্য করে। এটি বিশেষ করে এমন ক্ষেত্রগুলিতে উপকারী যেখানে ইউনিক আইডেন্টিফায়ার প্রয়োজন, যেমন ডেটা সিকিউরিটি এবং প্রাইভেট প্রপার্টি তৈরি করতে।
Symbol হল ES6 (ECMAScript 2015) এ যুক্ত একটি নতুন প্রিমিটিভ ডেটা টাইপ, যা একটি ইউনিক এবং অপরিবর্তনীয় মান প্রদান করে। Symbol এর মূল উদ্দেশ্য হলো বিভিন্ন প্রোপার্টি বা কনস্ট্যান্টের জন্য ইউনিক আইডেন্টিফায়ার তৈরি করা, যাতে আপনি গ্লোবাল স্কোপ বা অন্য অবজেক্টের প্রোপার্টি নামের সাথে সংঘর্ষ (name conflict) এড়াতে পারেন।
1. Symbol কী?
Symbol একটি নতুন ধরনের ডেটা টাইপ যা সবসময় ইউনিক মান তৈরি করে। এটি অন্যান্য ডেটা টাইপ (যেমন, স্ট্রিং, নাম্বার ইত্যাদি) এর থেকে আলাদা, কারণ Symbol এর মান কখনও পুনরাবৃত্তি হয় না এবং এটি অপরিবর্তনীয় (immutable)। একবার একটি Symbol তৈরি হলে, তা কোনোভাবেই পরিবর্তন করা যায় না।
উদাহরণ:
const sym1 = Symbol();
const sym2 = Symbol();
console.log(sym1 === sym2); // false
এখানে, sym1 এবং sym2 দুটি ভিন্ন Symbol, যার মান কখনোই সমান হবে না, যদিও উভয়ই Symbol() এর মাধ্যমে তৈরি করা হয়েছে।
2. Symbol এর ব্যবহারের উদ্দেশ্য
Symbol প্রধানত দুটি উদ্দেশ্যে ব্যবহার করা হয়:
- গোপনীয় প্রোপার্টি তৈরি করতে: এটি ক্লাস বা অবজেক্টে গোপনীয় প্রোপার্টি তৈরি করতে ব্যবহার করা যেতে পারে, যা বাইরে থেকে সহজে এক্সেস করা সম্ভব নয়।
- Unambiguous identifiers (স্পষ্ট আইডেন্টিফায়ার): যখন আপনি গ্লোবাল অবজেক্ট বা অবজেক্টের মধ্যে একাধিক প্রোপার্টি ব্যবহার করছেন, তখন Symbol এর মাধ্যমে ইউনিক আইডেন্টিফায়ার তৈরি করা যেতে পারে, যাতে কোনো সংঘর্ষ (name conflict) না হয়।
3. Symbol এর গঠন এবং ব্যবহার
Symbol() Constructor
Symbol তৈরি করার জন্য Symbol() কনস্ট্রাকটর ব্যবহার করা হয়। একটি Symbol তৈরি করার সময় আপনি একটি optional description প্রদান করতে পারেন, যা শুধুমাত্র ডিবাগিং বা লোগিং এর জন্য কাজে আসে। এটি কর্মক্ষম নয়, অর্থাৎ এটি Symbol এর মানে কোনো প্রভাব ফেলে না।
উদাহরণ:
const sym1 = Symbol('description');
const sym2 = Symbol('description');
console.log(sym1 === sym2); // false
console.log(sym1); // Symbol(description)
এখানে 'description' শুধুমাত্র একটি নির্দিষ্ট ব্যাখ্যা (description) হিসেবে কাজ করেছে, কিন্তু Symbol এর মান বা বৈশিষ্ট্য একই থাকেনি।
4. Symbol এর ব্যবহার
গোপনীয় প্রোপার্টি হিসেবে ব্যবহার
Symbol এর সবচেয়ে সাধারণ ব্যবহার হলো গোপনীয় প্রোপার্টি তৈরি করা। এটি এমন প্রোপার্টি তৈরি করতে সাহায্য করে যা বাইরের কোড থেকে অ্যাক্সেস করা সহজ নয়, কারণ Symbol এর মান অন্য যে কোনো মানের সাথে মেলানো সম্ভব নয়।
উদাহরণ:
const secretKey = Symbol('secret');
// Create an object with a Symbol property
const user = {
name: 'John',
age: 30,
[secretKey]: 'This is a secret value'
};
console.log(user.name); // John
console.log(user[secretKey]); // This is a secret value
এখানে secretKey একটি Symbol, যা শুধুমাত্র সেই অবজেক্টে থাকা কোড দ্বারা এক্সেসযোগ্য।
ইটারেবল অবজেক্টের জন্য Symbol.iterator
ES6 এ, Symbol.iterator একটি বিল্ট-ইন সিম্বল যা কোনো অবজেক্টের জন্য ইটারেটর (iterator) তৈরি করতে ব্যবহৃত হয়। যখন কোনো অবজেক্ট Symbol.iterator মেথড প্রদান করে, তখন এটি ইটারেবল হয়ে ওঠে এবং for...of লুপের মাধ্যমে উপাদানগুলি একে একে অ্যাক্সেস করা যেতে পারে।
উদাহরণ:
const myArray = [1, 2, 3];
const iterator = myArray[Symbol.iterator]();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
এখানে, Symbol.iterator ব্যবহার করে অ্যারের ইটারেটর তৈরি করা হয়েছে।
5. Global Symbols
ES6 এ একটি নতুন কনসেপ্ট যোগ হয়েছে যার নাম Global Symbols। আপনি যদি এমন একটি Symbol তৈরি করতে চান যা একাধিক স্কোপে এককভাবে ব্যবহার হতে পারে, তবে Symbol.for() মেথড ব্যবহার করতে পারেন। এটি একটি গ্লোবাল Symbol রেজিস্ট্রির মাধ্যমে একই নামের Symbol ফেরত দেয়।
উদাহরণ:
const globalSym1 = Symbol.for('globalSymbol');
const globalSym2 = Symbol.for('globalSymbol');
console.log(globalSym1 === globalSym2); // true
এখানে, Symbol.for() ব্যবহার করে তৈরি করা দুটি Symbol একই থাকে, কারণ এটি গ্লোবাল রেজিস্ট্রির মধ্যে সংরক্ষিত থাকে এবং একই নামের জন্য একই Symbol ফেরত দেয়।
6. Symbol.iterator এবং Custom Iterables
আপনি নিজেও Symbol.iterator মেথড ব্যবহার করে একটি কাস্টম iterable অবজেক্ট তৈরি করতে পারেন। এই পদ্ধতিতে, আপনি ইটারেটর তৈরি করে অবজেক্টের উপাদানগুলো একে একে প্রাপ্ত করতে পারবেন।
উদাহরণ:
const myIterable = {
data: ['apple', 'banana', 'cherry'],
[Symbol.iterator]() {
let index = 0;
const data = this.data;
return {
next() {
if (index < data.length) {
return { value: data[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (const fruit of myIterable) {
console.log(fruit); // apple, banana, cherry
}
এখানে, myIterable অবজেক্টে Symbol.iterator মেথড ব্যবহার করে একটি কাস্টম ইটারেটর তৈরি করা হয়েছে, যা for...of লুপে ব্যবহার করা হচ্ছে।
সারাংশ
- Symbol ES6-এ নতুন প্রিমিটিভ ডেটা টাইপ যা ইউনিক এবং অপরিবর্তনীয় মান তৈরি করে।
- এটি প্রোপার্টি নামের সংঘর্ষ প্রতিরোধে সহায়তা করে এবং গোপনীয় প্রোপার্টি তৈরি করতে ব্যবহৃত হয়।
- Global Symbols এবং Symbol.iterator এর মাধ্যমে আরও উন্নত কাস্টম ইটারেবল অবজেক্ট তৈরি করা সম্ভব।
- Symbol.for() মেথড গ্লোবাল রেজিস্ট্রিতে Symbol রেজিস্টার করতে ব্যবহৃত হয়, যা একাধিক স্কোপে এককভাবে ব্যবহৃত হতে পারে।
Symbol ES6 এর একটি নতুন ডেটা টাইপ, যা একটি unique identifier (অনন্য শনাক্তকারী) হিসেবে ব্যবহৃত হয়। Symbol দিয়ে আপনি এমন একটি ভ্যালু তৈরি করতে পারেন যা কখনও অন্য কোনো Symbol এর সাথে মিলে না। এটি সাধারণত অবজেক্টের প্রপার্টি কীগুলোর জন্য ব্যবহার করা হয়, বিশেষ করে যখন আপনি চান একটি কীগুলোর নাম সংঘর্ষ (collision) না হোক।
Symbol এর মূল বৈশিষ্ট্য
- Unque and Immutable: প্রতিটি
Symbolমান এক্সট্রা অনন্য এবং পরিবর্তনশীল নয় (immutable)। একইভাবে তৈরি করা দুইটিSymbolকখনোই সমান হবে না, যদিও তাদের ডিসক্রিপশন (description) একই হতে পারে। - Hidden Properties:
Symbolব্যবহার করে আপনি অবজেক্টে এমন প্রপার্টি তৈরি করতে পারেন যা বাইরের কোড থেকে সহজে অ্যাক্সেস করা যাবে না, অর্থাৎ এই প্রপার্টিগুলো সিক্রেট বা হিডেন থাকে।
Symbol তৈরি করার সিনট্যাক্স
const mySymbol = Symbol('description');
এখানে, 'description' হচ্ছে ঐ Symbol এর একটি ডিসক্রিপশন, যা শুধুমাত্র Symbol তৈরি করার সময় উপকারি হতে পারে। এটি কোনো মানের মতো কাজ করে না, কিন্তু কোডিং বা ডিবাগিংয়ের জন্য এর ব্যবহার উপকারী হতে পারে।
Symbol এর ব্যবহার
1. প্রপার্টি কীগুলোর জন্য
Symbol কে সাধারণত অবজেক্টের প্রপার্টি কীগুলোর জন্য ব্যবহার করা হয় যাতে কোনো নামের সংঘর্ষ না হয়। বিশেষ করে যখন আপনি আপনার কোডে লায়ব্রেরি বা ফ্রেমওয়ার্ক ব্যবহার করছেন এবং অবজেক্টের কীগুলি বাইরের কোডের সাথে মিশে যেতে পারে।
উদাহরণ:
const uniqueKey = Symbol('uniqueKey');
const obj = {};
obj[uniqueKey] = "This is a unique property";
console.log(obj[uniqueKey]); // "This is a unique property"
এখানে uniqueKey হচ্ছে একটি Symbol যা obj অবজেক্টের একটি প্রপার্টি হিসেবে ব্যবহার করা হয়েছে। যেহেতু Symbol একটি ইউনিক আইডেন্টিফায়ার, তাই এর মাধ্যমে যে প্রপার্টি তৈরি করা হয়েছে তা অন্য কোনো অবজেক্টের সাথে মিলে যাবে না।
2. অবজেক্টের প্রাইভেট প্রপার্টি হিসেবে
Symbol দিয়ে অবজেক্টের প্রাইভেট প্রপার্টি তৈরি করা যেতে পারে, যাতে বাইরের কোড সরাসরি সেই প্রপার্টিতে অ্যাক্সেস না করতে পারে।
উদাহরণ:
const password = Symbol('password');
const user = {
name: "Alice",
[password]: "1234" // password হচ্ছে একটি প্রাইভেট প্রপার্টি
};
console.log(user.name); // "Alice"
console.log(user[password]); // "1234"
এখানে, password একটি Symbol যার মাধ্যমে আমরা user অবজেক্টে একটি প্রাইভেট প্রপার্টি তৈরি করেছি। বাইরের কোড এই প্রপার্টি অ্যাক্সেস করতে পারবে না, যেহেতু password একটি অনন্য আইডেন্টিফায়ার।
Symbol.for() এবং Symbol.keyFor()
ES6 এ Symbol.for() এবং Symbol.keyFor() দুটি নতুন মেথড যোগ করা হয়েছে, যা সিম্বল এর ব্যবহার আরও শক্তিশালী করে।
Symbol.for(): এটি একটি গ্লোবাল সিম্বল রেজিস্ট্রি (global symbol registry) তৈরি করে এবং একই নামের সিম্বলটি যদি আগেই তৈরি থাকে তবে সেটি রিটার্ন করে।Symbol.keyFor(): এটি একটি গ্লোবাল সিম্বল এর কিওয়ার্ড (key) রিটার্ন করে।
উদাহরণ:
// Symbol.for() দিয়ে একটি সিম্বল তৈরি করা হচ্ছে
const globalSymbol = Symbol.for('appSettings');
// একই নামের সিম্বল ফেরত দিবে, যদি পূর্বে তৈরি থাকে
const sameGlobalSymbol = Symbol.for('appSettings');
console.log(globalSymbol === sameGlobalSymbol); // true
// Symbol.keyFor() দিয়ে সিম্বল এর কিওয়ার্ড পাওয়া যাচ্ছে
console.log(Symbol.keyFor(globalSymbol)); // "appSettings"
এখানে, Symbol.for() দিয়ে একটি গ্লোবাল সিম্বল তৈরি করা হয়েছে, এবং এটি একই নামের সিম্বল ফেরত দিবে, যদি আগে থেকে ওই নামের সিম্বল রেজিস্ট্রি থাকে। Symbol.keyFor() দিয়ে গ্লোবাল সিম্বল এর কিওয়ার্ড পাওয়া যায়।
Symbol এর সুবিধা
- অনন্য কীগুলি তৈরি করা:
Symbolদিয়ে এমন কীগুলি তৈরি করা যায় যা অন্য কোথাও মিলে যাবে না, ফলে অ্যাপ্লিকেশন বা লাইব্রেরির মধ্যে কনফ্লিক্ট (conflict) রোধ করা যায়। - প্রাইভেট প্রপার্টি:
Symbolদিয়ে অবজেক্টের প্রাইভেট প্রপার্টি তৈরি করা যায়, যা বাইরের কোডের থেকে নিরাপদ থাকে। - গ্লোবাল সিম্বল রেজিস্ট্রি:
Symbol.for()এবংSymbol.keyFor()এর মাধ্যমে গ্লোবাল সিম্বল রেজিস্ট্রি তৈরি করা যায়, যাতে আপনি একাধিক অংশে একই সিম্বল রেজিস্টার এবং ব্যবহার করতে পারেন।
Symbol এর সীমাবদ্ধতা
ইটারেটর হিসাবে ব্যবহার করা যায় না:
Symbolপ্রপার্টিগুলি ডিফল্টভাবে ইটারেবল বা এনামারেবল (iterable or enumerable) হয় না। অর্থাৎ, আপনি এগুলিকে সাধারণভাবেfor...inলুপের মাধ্যমে অ্যাক্সেস করতে পারবেন না।উদাহরণ:
const mySymbol = Symbol('mySymbol'); const obj = { [mySymbol]: "Some value", name: "Alice" }; for (let key in obj) { console.log(key); // Output: "name" }এখানে,
mySymbolপ্রপার্টিfor...inলুপে দেখানো হয়নি, কারণ এটি একটিSymbol।
Symbol একটি শক্তিশালী ফিচার যা কোডে ইউনিক আইডেন্টিফায়ার হিসেবে ব্যবহার করা যায়। এর মাধ্যমে আপনি অবজেক্টের প্রপার্টি কীগুলি নিরাপদভাবে তৈরি করতে পারেন, এবং এগুলিকে বাইরের কোড থেকে অ্যাক্সেস করা কঠিন করে তোলেন। Symbol ব্যবহার করে আপনি অ্যাপ্লিকেশন বা লাইব্রেরির মধ্যে নামের সংঘর্ষ রোধ করতে পারবেন এবং প্রাইভেট ডেটা বা প্রপার্টি তৈরি করতে পারবেন।
ES6 (ECMAScript 2015) এ Symbols একটি নতুন ডেটা টাইপ হিসেবে পরিচিতি পেয়েছে, যা বিশেষ ধরনের ইউনিক আইডেন্টিফায়ার তৈরি করতে ব্যবহৃত হয়। Symbols সাধারণত অবজেক্ট প্রোপার্টি হিসেবে ব্যবহার করা হয় এবং এটি এমন একধরনের primitive value যা অন্যান্য প্রোপার্টি নামের সাথে কনফ্লিক্ট করতে পারে না, কারণ প্রতিটি Symbol এর ভ্যালু একেবারে ইউনিক থাকে।
Symbol কী?
Symbol হলো একটি নতুন ডেটা টাইপ যা কোনো ভ্যালু রিপ্রেজেন্ট করে না, বরং একটি অনন্য এবং ইমিউটেবল (immutable) আইডেন্টিফায়ার তৈরি করে। এটি সাধারণত Symbol() ফাংশন ব্যবহার করে তৈরি করা হয়।
let symbol = Symbol('description');
console.log(symbol); // Symbol(description)
এখানে, Symbol() ফাংশনটি একটি নতুন এবং ইউনিক Symbol তৈরি করছে, যার একটি ঐচ্ছিক বর্ণনা ("description") দেয়া হয়েছে।
Symbols এর বৈশিষ্ট্য
- ইউনিক আইডেন্টিফায়ার: প্রতিটি Symbol একেবারে আলাদা এবং ইউনিক থাকে, যার মানে একটির সাথে অন্যটির কোনো সম্পর্ক নেই।
- প্রাইভেট প্রোপার্টি: Symbols এর মাধ্যমে আপনি এমন প্রোপার্টি তৈরি করতে পারেন যা অন্যান্য কোডের সাথে কনফ্লিক্ট করবে না, কারণ Symbols কখনোই পুনরায় তৈরি করা যায় না।
- অ্যাক্সেসযোগ্য নয়: সাধারণ প্রোপার্টি বা ভ্যালু হিসাবে Symbols অজানা বা সরাসরি অ্যাক্সেস করা যায় না, যতক্ষণ না আপনি ঐ Symbol কে জানেন বা ব্যবহার করেন।
Symbols এর সাথে Object Properties
Symbols ব্যবহার করে আপনি একটি অবজেক্টের প্রোপার্টি তৈরি করতে পারেন, এবং এটি এমন একটি প্রোপার্টি হবে যা অন্যান্য কোডের দ্বারা সহজে ওভাররাইড বা অ্যাক্সেস করা যাবে না।
Symbols ব্যবহার করে Object Property তৈরি করা
const mySymbol = Symbol('id');
const person = {
name: 'John',
[mySymbol]: 12345 // Symbol এর মাধ্যমে প্রোপার্টি তৈরি
};
console.log(person.name); // John
console.log(person[mySymbol]); // 12345
এখানে, mySymbol একটি Symbol এবং এটি person অবজেক্টের প্রোপার্টি হিসেবে ব্যবহৃত হয়েছে। আপনি সাধারণভাবে person.mySymbol দ্বারা এটি অ্যাক্সেস করতে পারবেন না, কিন্তু person[mySymbol] দ্বারা আপনি এটি অ্যাক্সেস করতে পারবেন।
Symbols এবং Object এর মধ্যে পার্থক্য
- প্রাইভেসি: যখন আপনি একটি Symbol ব্যবহার করেন, তখন সেই প্রোপার্টি শুধুমাত্র সঠিক Symbol দ্বারা অ্যাক্সেস করা সম্ভব। অন্য কোনো কোড, যার কাছে ঐ Symbol নেই, সেটি ওই প্রোপার্টি অ্যাক্সেস করতে পারবে না।
- নেম স্পেসের কনফ্লিক্ট থেকে মুক্তি: অন্য কোডের দ্বারা অবজেক্টের প্রোপার্টি নামের কনফ্লিক্ট হতে পারে, তবে Symbol ব্যবহার করে এই সমস্যা এড়ানো যায়, কারণ Symbols সবসময় ইউনিক থাকে।
Symbols ব্যবহার করে Object এ Hidden Properties তৈরি করা
একটি সাধারণ প্রয়োগ হলো, আপনি কিছু "হিডেন" প্রোপার্টি তৈরি করতে পারেন যা অন্য কোডের দ্বারা সরাসরি অ্যাক্সেস করা যাবে না, কিন্তু এখনও সেই প্রোপার্টি আপনার অবজেক্টের অংশ হিসেবে থাকবে।
const hiddenKey = Symbol('hidden');
const user = {
name: 'Alice',
age: 30,
[hiddenKey]: 'secret information'
};
console.log(user.name); // Alice
console.log(user[hiddenKey]); // secret information
এখানে, hiddenKey Symbol দ্বারা user অবজেক্টের একটি "হিডেন" প্রোপার্টি তৈরি করা হয়েছে। অন্য কোড সরাসরি এটি অ্যাক্সেস করতে পারবে না, কিন্তু user[hiddenKey] ব্যবহার করে আপনি এটি অ্যাক্সেস করতে পারবেন।
Symbols এবং Object.keys()
এটি মনে রাখা গুরুত্বপূর্ণ যে, Symbol এর মাধ্যমে তৈরি প্রোপার্টি সাধারণভাবে Object.keys(), for...in, এবং অন্যান্য লুপ মেথডের দ্বারা ধরা পড়ে না। তবে, Object.getOwnPropertySymbols() মেথড ব্যবহার করে আপনি Symbol প্রোপার্টিগুলো পেতে পারেন।
Example:
const sym1 = Symbol('sym1');
const sym2 = Symbol('sym2');
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
regularProp: 'regular value'
};
// Object.keys() এটি দেখাবে না
console.log(Object.keys(obj)); // ["regularProp"]
// Object.getOwnPropertySymbols() এটি দেখতে পারবে
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(sym1), Symbol(sym2)]
এখানে, Object.keys() শুধুমাত্র সাধারণ প্রোপার্টি দেখাবে, কিন্তু Object.getOwnPropertySymbols() শুধুমাত্র Symbol প্রোপার্টি দেখাবে।
Symbols ES6 এর একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে unique identifiers তৈরি করতে সহায়ক। এটি সাধারণ অবজেক্ট প্রোপার্টির সাথে কনফ্লিক্ট না করে গোপন বা প্রাইভেট প্রোপার্টি তৈরি করতে সুবিধা দেয়। বিশেষত, যখন আপনি কোনো কোডের মধ্যে কনফ্লিক্ট এড়াতে চান অথবা মডিউল ব্যবস্থায় প্রাইভেট ডেটা ব্যবহার করতে চান, তখন Symbols অত্যন্ত কার্যকরী।
Symbols এর মাধ্যমে আপনি কোডের নিরাপত্তা বাড়াতে পারেন এবং এটির সাহায্যে প্রোপার্টির নাম বা মানের পুনরাবৃত্তি এড়িয়ে একটি সংগঠিত ও নিরাপদ কোড বেস তৈরি করতে পারেন।
ES6 (ECMAScript 2015) এ Well-known Symbols পরিচিত একটি ধারণা, যা বিভিন্ন ইন্টানেল অপারেশন এবং আচরণ নির্ধারণ করতে ব্যবহৃত হয়। এই Symbols গুলি সাধারণত JavaScript ইঞ্জিন দ্বারা ব্যবহৃত হয়, কিন্তু আপনি এগুলিকে কাস্টম ব্যবহারেও কাজে লাগাতে পারেন। Well-known Symbols গুলি একটি ধরনের বিশেষ প্রকারের Symbols যা কিছু নির্দিষ্ট কাজের জন্য ব্যবহার করা হয়, যেমন iteration, toString কনভার্সন, ওবজেক্টের property চেক ইত্যাদি।
Well-known Symbols কী?
Well-known Symbols গুলি মূলত JavaScript এর বিল্ট-ইন behavior বা functionality এর সাথে সম্পর্কিত। এগুলো Symbol অবজেক্টের বিশেষ কনস্ট্যান্ট হিসেবে ব্যবহৃত হয়। এগুলি JavaScript এর বিভিন্ন built-in মেকানিজমকে কাস্টমাইজ বা এক্সটেন্ড করার সুযোগ দেয়।
Well-known Symbols এর তালিকা:
Symbol.iterator
এটি iterable অবজেক্টগুলোর জন্য ব্যবহৃত হয়, যাfor...ofলুপের সাথে কাজ করে।Symbol.asyncIterator
এটি asynchronous iteration এর জন্য ব্যবহৃত হয়। এটি async iterator তৈরি করার জন্য প্রয়োজনীয় একটি symbol।Symbol.hasInstance
এটি একটি কাস্টমinstanceofচেক করার জন্য ব্যবহৃত হয়, যেটি একটি অবজেক্টের prototype চেক করে।Symbol.toPrimitive
এটি একটি কাস্টম toPrimitive কনভার্সন মেথড তৈরি করতে ব্যবহৃত হয়, যাতে আপনি নিজে কিভাবে আপনার অবজেক্টের primitive (string, number ইত্যাদি) মান পাবেন তা কাস্টমাইজ করতে পারেন।Symbol.toStringTag
এটিObject.prototype.toString()মেথডের ফলাফল কাস্টমাইজ করতে ব্যবহৃত হয়। এটি একটি object এর type নির্ধারণ করতে সাহায্য করে।Symbol.match
এটিString.prototype.match()মেথডের behavior কাস্টমাইজ করতে ব্যবহৃত হয়।Symbol.replace
এটিString.prototype.replace()মেথডের behavior কাস্টমাইজ করতে ব্যবহৃত হয়।Symbol.search
এটিString.prototype.search()মেথডের behavior কাস্টমাইজ করতে ব্যবহৃত হয়।Symbol.split
এটিString.prototype.split()মেথডের behavior কাস্টমাইজ করতে ব্যবহৃত হয়।Symbol.unscopables
এটি একটি অবজেক্টের জন্য নির্ধারণ করে যে কোন প্রপার্টি বা মেথডটি with ব্লকের স্কোপে থাকবে না।
Well-known Symbols এর ব্যবহার
1. Symbol.iterator
Symbol.iterator symbol অবজেক্টগুলোকে iterable করে তোলে, যাতে for...of লুপ ব্যবহার করে তাদের উপর iteration করা যায়।
const myArray = [1, 2, 3];
const iterator = myArray[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
এখানে, Symbol.iterator ব্যবহার করে আমরা একটি array তে iterator তৈরি করেছি।
2. Symbol.asyncIterator
এটি asynchronous iteration এর জন্য ব্যবহৃত হয়, যেমন asynchronous data stream বা API call এর ক্ষেত্রে। for await...of লুপ ব্যবহার করে এটি কাজ করে।
const myAsyncArray = {
async *[Symbol.asyncIterator]() {
yield 1;
yield 2;
yield 3;
}
};
(async () => {
for await (const num of myAsyncArray) {
console.log(num); // 1, 2, 3
}
})();
এখানে, Symbol.asyncIterator ব্যবহার করে একটি asynchronous iterable অবজেক্ট তৈরি করা হয়েছে। এই অবজেক্টের উপর for await...of লুপ দিয়ে iteration করা হচ্ছে।
3. Symbol.hasInstance
Symbol.hasInstance ব্যবহার করে আপনি instanceof অপারেটরের behavior কাস্টমাইজ করতে পারেন।
class MyClass {
static [Symbol.hasInstance](instance) {
return instance instanceof Array;
}
}
console.log([] instanceof MyClass); // true
console.log({} instanceof MyClass); // false
এখানে, Symbol.hasInstance এর মাধ্যমে instanceof চেককে কাস্টমাইজ করা হয়েছে, যাতে MyClass এর instance শুধুমাত্র Array হতে পারে।
4. Symbol.toPrimitive
Symbol.toPrimitive ব্যবহার করে আপনি কাস্টম primitive কনভার্সন মেথড তৈরি করতে পারেন।
const myObject = {
value: 42,
[Symbol.toPrimitive](hint) {
if (hint === 'string') {
return `The value is ${this.value}`;
} else {
return this.value;
}
}
};
console.log(String(myObject)); // "The value is 42"
console.log(Number(myObject)); // 42
এখানে, Symbol.toPrimitive ব্যবহার করে myObject এর primitive মান কাস্টমাইজ করা হয়েছে।
5. Symbol.toStringTag
Symbol.toStringTag ব্যবহার করে Object.prototype.toString() মেথডের আউটপুট কাস্টমাইজ করা যায়।
const myObject = {
[Symbol.toStringTag]: 'MyCustomObject'
};
console.log(Object.prototype.toString.call(myObject)); // "[object MyCustomObject]"
এখানে, Symbol.toStringTag ব্যবহার করে toString() মেথডের আউটপুট কাস্টমাইজ করা হয়েছে।
সারাংশ
ES6 এর Well-known Symbols এমন কিছু বিশেষ Symbols যা JavaScript এর ইনবিল্ট মেকানিজম এবং behavior কাস্টমাইজ করতে ব্যবহৃত হয়। এগুলি ব্যবহার করে আপনি বিভিন্ন built-in মেথডগুলোর আচরণ পরিবর্তন করতে, নতুন iteration পদ্ধতি তৈরি করতে এবং কাস্টম কনভার্সন সিস্টেম তৈরি করতে পারেন। এগুলোর মাধ্যমে কোড আরও শক্তিশালী, ফ্লেক্সিবল এবং রিডেবল হয়।
Read more