You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/08-symbol/article.md
+14-14
Original file line number
Diff line number
Diff line change
@@ -74,16 +74,16 @@ alert(id.description); // id
74
74
75
75
সিম্বল অবজেক্টের মধ্যে একটি "hidden" প্রপার্টি রাখার সুবিধা প্রদান করে, যাতে অনিচ্ছাকৃত কোন প্রপার্টি অ্যাক্সেস বা ওভাররাইট করা না যায়।
76
76
77
-
যেমন, আমাদের একটি `user` অবজেক্ট আছে, যেটি অন্য আরেকটি থার্ড-পার্টি কোডও অ্যাক্সেস করে। এখন আমরা এর জন্য একটি আইডেন্টিফায়ার সেট করতে চাই।
77
+
যেমন, মনে করুন আমরা একটি প্যাকেজ ডেভলাপ করতেছি এবং আমরা আর্গুমেন্ট হিসেবে একটি অবজেক্ট নিয়ে তার মধ্যে আমাদের লজিকগুলো ইমপ্লিমেন্ট করি, যেমন একটি `user` অবজেক্ট আছে, এখন এটি আমরা আমাদের প্যাকেজে আর্গুমেন্ট হিসেবে। এখন আমরা আমাদের সুবিধার জন্য এর একটি আইডেন্টিফায়ার সেট করতে চাই।
78
78
79
79
চলুন এর জন্য একটি সিম্বল প্রপার্টি ব্যবহার করি:
80
80
81
81
```js run
82
-
let user = { //যা অন্য আরেকটি কোডের সাথে সম্পর্কিত
82
+
let user = { //মূল অবজেক্ট এর কোড
83
83
name:"John"
84
84
};
85
85
86
-
let id =Symbol("id");
86
+
let id =Symbol("id");// আমাদের প্যাকেজের কোড
87
87
88
88
user[id] =1;
89
89
@@ -92,11 +92,11 @@ alert( user[id] ); // এখন আমরা এর ডাটাকে সিম
92
92
93
93
এটিতো আমরা চাইলে স্ট্রিং প্রপার্টি `"id"` দ্বারাও করতে পারতাম তার পরিবর্তে `Symbol("id")` ব্যবহার সুবিধাজনক কেন?
94
94
95
-
যেহেতু `user` অবজেক্টটি অন্য আরেকটি স্ক্রিপ্টের সাথেও সম্পর্কিত, এবং ঐ কোডটিও যেহেতু `user` অবজেক্ট নিয়ে কাজ করে, আমরা চাইনা এর মধ্যে নতুন আরেকটি প্রপার্টি যুক্ত হোক। এবং নিরাপত্তার খাতিরে এটি থার্ড পার্টি স্ক্রিপ্টের জন্য অ্যাক্সেসবল হওয়াও উচিত নয়, সিম্বল ব্যবহার করায় আমরা এই ব্যাপারে নিশ্চিত থাকতে পারি সিম্বল ডাটাসমূহ এক স্ক্রিপ্টের সাথে অন্য স্ক্রিপ্টের মধ্যে আদান প্রদান হবে না।
95
+
যেহেতু `user` অবজেক্টটি অন্য আরেকটি স্ক্রিপ্ট হতে এসেছে এবং ঐ কোডটিও যেহেতু `user` অবজেক্ট নিয়ে কাজ করে, আমরা চাইনা এর মধ্যে আমাদের আইডেন্টিফিকেশনের জন্য ব্যবহার করা প্রপার্টিটি অন্য স্ক্রিপ্টে অ্যাক্সেসবল হোক। এবং নিরাপত্তার খাতিরে এটি ভিন্ন স্ক্রিপ্টের জন্য অ্যাক্সেসবল হওয়াও উচিত নয়, সিম্বল ব্যবহার করায় আমরা এই ব্যাপারে নিশ্চিত থাকতে পারি সিম্বল ডাটাসমূহ এক স্ক্রিপ্টের সাথে অন্য স্ক্রিপ্টের মধ্যে আদান প্রদান হবে না।
96
96
97
-
এছাড়াও, মনে করুন ঐ থার্ড পার্টি স্ক্রিপ্ট তাদের আইডেন্টিফিকেশনের জন্য `user` অবজেক্টে একই নামের একটি আইডেন্টিটি সেট করে। এক্ষেত্রে আমরা নিশ্চিন্ত থাকতে পারি দুটি সিম্বলের নাম একই হওয়ার পরও স্ক্রিপ্টদুটির মধ্যে ডাটা লিক বা ওভাররাইড হবে না।
97
+
এছাড়াও, মনে করুন মূল স্ক্রিপ্টে আইডেন্টিফিকেশনের জন্য `user` অবজেক্টে একই নামের একটি আইডেন্টিটি সেট করে। এক্ষেত্রে আমরা নিশ্চিন্ত থাকতে পারি দুটি সিম্বলের নাম একই হওয়ার পরও স্ক্রিপ্টদুটির মধ্যে ডাটা লিক বা ওভাররাইড হবে না।
98
98
99
-
এক্ষেত্রে ঐ স্ক্রিপ্ট তার নিজস্ব আইডেন্টিটিরে জন্য সিম্বল তৈরি করতে পারে এভাবে, `Symbol("id")`:
99
+
এক্ষেত্রে মূল স্ক্রিপ্ট তার নিজস্ব আইডেন্টিটিরে জন্য সিম্বল তৈরি করতে পারে এভাবে, `Symbol("id")`:
@@ -226,7 +226,7 @@ alert( Symbol.keyFor(sym) ); // name
226
226
alert( Symbol.keyFor(sym2) ); // id
227
227
```
228
228
229
-
`Symbol.keyFor` ব্যবহার করা হয় ইন্টারনালি কোন ঐ নামের কোন গ্লোবাল সিম্বল ডিক্লেয়ার করা হয়েছে কিনা তা জানতে। সুতরাং এটি নন-গ্লোবাল সিম্বলের জন্য কাজ করবে না। যদি কোন গ্লোবাল সিম্বল না থাকে তাহলে `undefined` রিটার্ন করবে।
229
+
`Symbol.keyFor` ব্যবহার করা হয় ইন্টারনালি ঐ নামের কোন গ্লোবাল ইতোমধ্যে সিম্বল ডিক্লেয়ার করা হয়েছে কিনা তা জানতে। সুতরাং এটি নন-গ্লোবাল সিম্বলের জন্য কাজ করবে না। যদি কোন গ্লোবাল সিম্বল না থাকে তাহলে `undefined` রিটার্ন করবে।
230
230
231
231
তবে সব সিম্বলের `description` প্রপার্টি আছে।
232
232
@@ -254,25 +254,25 @@ alert( localSymbol.description ); // name
254
254
-`Symbol.toPrimitive`
255
255
- ...ইত্যাদি.
256
256
257
-
যেমন, `Symbol.toPrimitive` অবজেক্টকে প্রিমিটিভ কনভার্শন করতে দেয়। যা নিয়ে সামনে আলোচনা করা হবে।
257
+
যেমন, `Symbol.toPrimitive` অবজেক্টকে প্রিমিটিভ কনভার্শন করতে ব্যবহার করা হয়। যা নিয়ে পরবর্তী অনুচ্ছেদে আলোচনা করা হয়েছে।
258
258
259
-
আমরা অন্যান্য সিম্বল সমূহ নিয়েও পরিচিত হয়ে যাব ল্যাংগুয়েজ ফিচার নিয়ে আলোচনার সময়।
259
+
আমরা অন্যান্য সিম্বল সমূহ নিয়েও পরিচিত হয়ে যাব আরো ভিবিন্ন ল্যাংগুয়েজ ফিচার নিয়ে আলোচনার সময়।
260
260
261
261
## সারাংশ
262
262
263
263
`Symbol` হল ইউনিক আইডেন্টিফায়ারের একটি প্রিমিটিভ টাইপ।
264
264
265
265
সিম্বল তৈরি করা হয় `Symbol()` দ্বারা যেটির একটি অপশনাল প্যারামিটার(name) আছে।
266
266
267
-
প্রতিটি সিম্বল স্বতন্ত্র। এমনকি যদি দুটি সিম্বলের মান একইও হয়। যদি আমরা কোন সিম্বলকে একই নামে ইনিশিয়ালাইজ করতে চাই তাহলে আমাদের গ্লোবাল রেজিস্ট্রি ব্যবহার করতে হবে: `Symbol.for(key)` এটি চেক করবে একই নামের আগে কোন সিম্বল ডিক্লেয়ার করা হয়েছে কিনা, যদি হয়ে থাকে তাহলে ঐ সিম্বলকে রেফারেন্স করে অন্যথায় `undefined`।
267
+
প্রতিটি সিম্বল স্বতন্ত্র। এমনকি যদি দুটি সিম্বলের মান একইও হয়। এছাড়াও যদি আমরা কোন সিম্বলকে একই নামে ইনিশিয়ালাইজ করতে চাই তাহলে আমাদের গ্লোবাল রেজিস্ট্রি ব্যবহার করতে হবে: `Symbol.for(key)` এটি চেক করবে একই নামের আগে কোন সিম্বল ডিক্লেয়ার করা হয়েছে কিনা, যদি হয়ে থাকে তাহলে ঐ সিম্বলকে রেফারেন্স করে অন্যথায় `undefined`।
268
268
269
269
সিম্বলের দুটি প্রধান ব্যবহার হল:
270
270
271
271
1. "হিডেন" অবজেক্ট প্রপার্টি।
272
-
যদি আমরা কোন একটি অবজেক্টে কোন প্রপার্টি সংযুক্ত করতে চাই যেটি অন্য আরেকটি স্ক্রিপ্ট বা লাইব্রেরিতে ব্যবহার হয়, এবং আমরা চাই প্রপার্টিসমূহ যেন উভয়ের মধ্যে হিডেন থাকে, তখন আমরা সিম্বল প্রপার্টি ব্যবহার করি। সিম্বলিক প্রপার্টিসমূহ `for..in` বা `Object.keys(user)` দ্বারা অ্যাক্সেসবল না। এছাড়াও সরাসরিও এক স্ক্রিপ্টের সিম্বল অন্য স্ক্রিপ্ট থেকে অ্যাক্সেসবল হবে না, কেননা অন্য স্ক্রিপ্টে সিম্বল অ্যাক্সেস হবে না। ফলে স্ক্রিপ্টের মধ্যে মধ্যে ডাটা লিক বা ওভাররাইড হওয়ার সম্ভাবনা থাকে না।
272
+
যদি আমরা কোন একটি অবজেক্টে কোন প্রপার্টি সংযুক্ত করতে চাই যেটি অন্য আরেকটি স্ক্রিপ্ট বা লাইব্রেরিতে ব্যবহার হয়, এবং আমরা চাই প্রপার্টিসমূহ যেন উভয়ের মধ্যে হিডেন থাকে, তখন আমরা সিম্বল প্রপার্টি ব্যবহার করি। সিম্বলিক প্রপার্টিসমূহ `for..in` বা `Object.keys(user)` দ্বারা অ্যাক্সেসিবল না। এছাড়াও সরাসরিও এক স্ক্রিপ্টের সিম্বল অন্য স্ক্রিপ্ট থেকে অ্যাক্সেসিবল হবে না, কেননা অন্য স্ক্রিপ্টে সিম্বল অ্যাক্সেস হবে না। ফলে স্ক্রিপ্টের মধ্যে মধ্যে ডাটা লিক বা ওভাররাইড হওয়ার সম্ভাবনা থাকে না।
273
273
274
274
সুতরাং অবজেক্টের কোন কিছু হিডেন রাখতে আমরা সিম্বল ব্যবহার করতে পারি।
275
275
276
276
2. এছাড়াও আরো অনেক সিম্বল সিস্টেম আছে যেগুলো জাভাস্ক্রিপ্টের সাহায্যে অ্যাক্সেসিবল `Symbol.*`। অবজেক্টের কিছু বিহেভিয়ার পরিবর্তনের জন্য আমরা এদের ব্যবহার করি। যেমন [iterables](info:iterable) টিউটোরিয়ালে `Symbol.iterator` এবং [object-to-primitive conversion](info:object-toprimitive) এ `Symbol.toPrimitive` এর ব্যবহার দেখব।.
277
277
278
-
তবে, সিম্বল কিন্তু প্রকৃতপক্ষে 100% হিডেন না। একটি বিল্ট ইন মেথড আছে যেটি সকল সিম্বলকে রিটার্ন করে, এছাড়াও আরেকটি মেথড আছে [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) যেটি সকল প্রপার্টি (সিম্বল সহ) রিটার্ন করে। সুতরাং বলা যায় এরা প্রকৃতপক্ষে হিডেন না। তবে বেশিরভাগ লাইব্রেরী এই মেথডগুলো নিয়ে কাজ করেনা।
278
+
তবে, সিম্বল কিন্তু প্রকৃতপক্ষে ১০০% হিডেন না। একটি বিল্ট ইন মেথড আছে ` Object.getOwnPropertySymbols(obj)`যেটি সকল সিম্বলকে রিটার্ন করে, এছাড়াও আরেকটি মেথড আছে [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) যেটি সকল প্রপার্টি (সিম্বল সহ) রিটার্ন করে। সুতরাং বলা যায় এরা প্রকৃতপক্ষে হিডেন না। তবে বেশিরভাগ লাইব্রেরী এই মেথডগুলো নিয়ে কাজ করেনা।
0 commit comments