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/07-object-properties/02-property-accessors/article.md
+46-46
Original file line number
Diff line number
Diff line change
@@ -1,31 +1,31 @@
1
1
2
-
# Property getters and setters
2
+
# প্রপার্টি getter এবং setter
3
3
4
-
There are two kinds of object properties.
4
+
জাভাস্ক্রিপ্টে অবজেক্ট প্রপার্টি দুই ধরণের।
5
5
6
-
The first kind is*data properties*. We already know how to work with them. All properties that we've been using until now were data properties.
6
+
এর মধ্যে একটি হল*data properties*। ইতোমধ্যে আমরা এদের দেখেছি। এই পর্যন্ত আমরা যেসব প্রপার্টি দেখেছি তাদের বলা হয় ডাটা প্রপার্টিস।
7
7
8
-
The second type of properties is something new. It's*accessor properties*. They are essentially functions that execute on getting and setting a value, but look like regular properties to an external code.
8
+
আরেক প্রকার প্রপার্টিটি আমাদের জন্য নতুন। একে বলা হয়*accessor properties*। আসলে এরা হল ফাংশন যার মাধ্যমে কোন ভ্যালু *get* বা *set* করা যায়। তবে এরা রেগুলার প্রপার্টির ন্যায় কাজ করে।
9
9
10
-
## Getters and setters
10
+
## Getters এবং setters
11
11
12
-
Accessor properties are represented by "getter" and "setter" methods. In an object literal they are denoted by `get`and`set`:
12
+
অ্যাক্সেসর প্রপার্টিকে সাধারণত রিপ্রেজেন্ট করা হয় "getter" এবং "setter" মেথড দ্বারা। অবজেক্টে লিখার সময় এদের লিখা হয় `get`এবং`set` দ্বারা:
13
13
14
14
```js
15
15
let obj = {
16
16
*!*get propName()*/!* {
17
-
// getter, the code executed on getting obj.propName
17
+
// getter, এটি এক্সিকিউট হবে যখন obj.propName কল হবে
18
18
},
19
19
20
20
*!*set propName(value)*/!* {
21
-
// setter, the code executed on setting obj.propName = value
21
+
// setter, এটি এক্সিকিউট হবে যখন obj.propName = value কল হবে
22
22
}
23
23
};
24
24
```
25
25
26
-
The getter works when`obj.propName`is read, the setter -- when it is assigned.
26
+
অর্থাৎ getter কল হয়`obj.propName`এর মান পড়তে, এবং setter কল হয় মান অ্যাসাইন করতে।
27
27
28
-
For instance, we have a `user`object with `name`and`surname`:
28
+
যেমন, আমাদের `user`অবজেক্টে প্রপার্টিসমূহ হল `name`এবং`surname`:
29
29
30
30
```js
31
31
let user = {
@@ -34,7 +34,7 @@ let user = {
34
34
};
35
35
```
36
36
37
-
Now we want to add a`fullName`property, that should be`"John Smith"`. Of course, we don't want to copy-paste existing information, so we can implement it as an accessor:
37
+
এখন আমরা একটি একটি নতুন প্রপার্টি`fullName`সংযোজন করতে চাচ্ছি, যেটির মান হবে`"John Smith"`। অবশ্যই আমরা নামগুলো কপি-পেস্টের মাধ্যমে লিখতে চাই না, সুতরাং আমরা এর জন্য অ্যাক্সেসর ব্যবহার করতে পারি:
38
38
39
39
```js run
40
40
let user = {
@@ -53,9 +53,9 @@ alert(user.fullName); // John Smith
53
53
*/!*
54
54
```
55
55
56
-
From the outside, an accessor property looks like a regular one. That's the idea of accessor properties. We don't *call*`user.fullName`as a function, we *read*it normally: the getter runs behind the scenes.
56
+
সাধারণত অ্যাক্সেসর প্রপার্টি সমূহ অবজেক্ট নিয়ে কাজ করার সময় সাধারণ প্রপার্টির মত কাজ করে। এটিই অ্যাক্সেসর প্রপার্টির আইডিয়া। আমরা `user.fullName`কে ফাংশন হিসেবে *call* করব না, কিন্তু এদের আমরা সাধারণ প্রপার্টির মত *read*করতে পারব: এখানে getters আমাদের অন্তরালে কাজ করবে।
57
57
58
-
As of now, `fullName`has only a getter. If we attempt to assign `user.fullName=`, there will be an error:
58
+
এ পর্যন্ত, আমরা `fullName`এর জন্য getter ব্যবহার করেছি। এখন আমরা যদি এর মধ্যে মান অ্যাসাইন করতে চাই অর্থাৎ `user.fullName=`, তাহলে একটি এরর হবে:
59
59
60
60
```js run
61
61
let user = {
@@ -65,11 +65,11 @@ let user = {
65
65
};
66
66
67
67
*!*
68
-
user.fullName="Test"; // Error (property has only a getter)
68
+
user.fullName="Test"; // Error (কেননা প্রপার্টির জন্য শুধুমাত্র getter সংজ্ঞায়িত করা হয়েছে)
69
69
*/!*
70
70
```
71
71
72
-
Let's fix it by adding a setter for `user.fullName`:
72
+
চলুন, `user.fullName` এর জন্য একটি setter ফাংশন লিখি:
73
73
74
74
```js run
75
75
let user = {
@@ -87,29 +87,29 @@ let user = {
87
87
*/!*
88
88
};
89
89
90
-
//set fullName is executed with the given value.
90
+
//এখন fullName আমাদের নতুন মানের জন্য কাজ করবে
91
91
user.fullName="Alice Cooper";
92
92
93
93
alert(user.name); // Alice
94
94
alert(user.surname); // Cooper
95
95
```
96
96
97
-
As the result, we have a "virtual" property`fullName`. It is readable and writable.
97
+
getter এবং setter এর মাধ্যমে আমরা একটি "virtual" প্রপার্টি`fullName` ডিক্লেয়ার করেছি। যেটি পঠনযোগ্য এবং লিখনযোগ্য (readable এবং writable)।
98
98
99
-
## Accessor descriptors
99
+
## অ্যাক্সেসর ডেস্ক্রিপ্টর
100
100
101
-
Descriptors for accessor properties are different from those for data properties.
101
+
অ্যাক্সেসর প্রপার্টির জন্য ডেস্ক্রিপ্টর প্রপার্টি সমূহ ডাটা প্রপার্টি থেকে ভিন্ন।
102
102
103
-
For accessor properties, there is no `value`or`writable`, but instead there are `get`and`set`functions.
103
+
অ্যাক্সেসর প্রপার্টির জন্য, কোন `value`বা`writable` ফ্ল্যাগ থাকে না, তার পরিবর্তে `get`এবং`set`ফাংশন আছে।
104
104
105
-
That is, an accessor descriptor may have:
105
+
অ্যাক্সেসর ডেস্ক্রিপ্টর এ থাকে:
106
106
107
-
-**`get`** -- a function without arguments, that works when a property is read,
108
-
-**`set`** -- a function with one argument, that is called when the property is set,
109
-
-**`enumerable`** -- same as for data properties,
110
-
-**`configurable`** -- same as for data properties.
107
+
-**`get`** -- একটি ফাংশন যার কোন আর্গুমেন্ট থাকে না, এটি প্রপার্টির মান পড়তে ব্যবহার হয়,
108
+
-**`set`** -- একটি ফাংশন যার একটি আর্গুমেন্ট থাকে, যখন কোন মান অ্যাসাইন করতে চাই তখন কল হবে,
109
+
-**`enumerable`** -- ডাটা প্রপার্টির মত কাজ করে,
110
+
-**`configurable`** -- ডাটা প্রপার্টির মত কাজ করে,
111
111
112
-
For instance, to create an accessor `fullName` with `defineProperty`, we can pass a descriptor with `get`and`set`:
112
+
যেমন, নিচের কোডে আমরা `defineProperty` এর মাধ্যমে `fullName` ডিফাইন করব, এর জন্য আমরা `get`এবং`set` ফাংশন ব্যবহার করি:
113
113
114
114
```js run
115
115
let user = {
@@ -134,9 +134,9 @@ alert(user.fullName); // John Smith
134
134
for(let key in user) alert(key); // name, surname
135
135
```
136
136
137
-
Please note that a property can be either an accessor (has`get/set`methods) or a data property (has a `value`), not both.
137
+
দয়া করে মনে রাখুন কোন প্রপার্টি হয় অ্যাক্সেসর হবে (অর্থাৎ`get/set`মেথড) থাকবে অন্যথায় ডাটা প্রপার্টি হবে (`value` থাকে), একই সাথে অ্যাক্সেসর এবং ডাটা প্রপার্টি হবে না।
138
138
139
-
If we try to supply both`get`and`value`in the same descriptor, there will be an error:
139
+
যদি আমরা এভাবে করতে চাই অর্থাৎ`get`এবং`value`উভয়ই যদি ডেস্ক্রিপ্টর এ ডিফাইন করি তাহলে এরর হবে:
Getters/setters can be used as wrappers over "real" property values to gain more control over operations with them.
156
+
Getters/setters দ্বারা আমরা আমাদের প্রপার্টি সমূহকে আরো বিভিন্ন ভাবে কন্ট্রোল করতে পারি।
157
157
158
-
For instance, if we want to forbid too short names for `user`, we can have a setter `name`and keep the value in a separate property `_name`:
158
+
যেমন, যদি আমরা আমাদের `user` এর নাম সংক্ষিপ্ত হওয়া এড়াতে চাই, এক্ষেত্রে আমরা setter দ্বারা `name`কে আলাদা করে `_name` প্রপার্টিতে সেট করতে পারি এবং সংক্ষিপ্ত নামের জন্য একটি অ্যালার্ট দেখাতে পারি:
159
159
160
160
```js run
161
161
let user = {
@@ -175,19 +175,19 @@ let user = {
175
175
user.name="Pete";
176
176
alert(user.name); // Pete
177
177
178
-
user.name=""; //Name is too short...
178
+
user.name=""; //সংক্ষিপ্ত নাম...
179
179
```
180
180
181
-
So, the name is stored in`_name`property, and the access is done via getter and setter.
181
+
সুতরাং আমাদের মূল নামটি সংরক্ষন হবে`_name`প্রপার্টি এর মধ্যে তবে আমরা `name` কে পড়ব বা অ্যাসাইন করব getter এবং setter এর দ্বারা।
182
182
183
-
Technically, external code is able to access the name directly by using `user._name`. But there is a widely known convention that properties starting with an underscore `"_"` are internal and should not be touched from outside the object.
183
+
আমরা জানি, যেসব প্রপার্টির নাম আন্ডারস্কোর `"_"` দিয়ে শুরু হয় তারা হল ইন্টারনাল প্রপার্টি এদের বাহির হতে অ্যাক্সেস করা উচিত নই, যদিও টেকনিক্যালি `user._name` এর মান বাহির হতে পাওয়া সম্ভব।
184
184
185
185
186
-
## Using for compatibility
186
+
## কোড এর সামঞ্জস্য
187
187
188
-
One of the great uses of accessors is that they allow to take control over a "regular" data property at any moment by replacing it with a getter and a setter and tweak its behavior.
188
+
অ্যাক্সেসরের অন্যতম দারুন একটি ব্যবহার হল এর মাধ্যমে আমরা আমাদের প্রপার্টি সমূহের ডাটা পরিবর্তন হলেও এর বিহেভিয়ার অপরিবর্তনীয় রাখতে পারি।
189
189
190
-
Imagine we started implementing user objects using data properties `name`and`age`:
190
+
মনে করুন আমাদের একটি `User` অবজেক্ট আছে যাদের প্রপার্টি হল `name`এবং`age`:
191
191
192
192
```js
193
193
functionUser(name, age) {
@@ -200,7 +200,7 @@ let john = new User("John", 25);
200
200
alert( john.age ); // 25
201
201
```
202
202
203
-
...But sooner or later, things may change. Instead of `age`we may decide to store `birthday`, because it's more precise and convenient:
203
+
...তবে পরবর্তীতে আমরা আমাদের কোডকে পরিবর্তন করলাম। `age`এর পরিবর্তে আমরা এখন `birthday` সংরক্ষণ করব, কেননা এটি বেশি সুস্পষ্ট এবং সুবিধাজনক:
204
204
205
205
```js
206
206
functionUser(name, birthday) {
@@ -211,21 +211,21 @@ function User(name, birthday) {
211
211
let john =newUser("John", newDate(1992, 6, 1));
212
212
```
213
213
214
-
Now what to do with the old code that still uses `age` property?
214
+
এখন আমাদের যেসব কোডে `age` প্রপার্টি ব্যবহার করা হয়েছে তাদের কি হবে?
215
215
216
-
We can try to find all such places and fix them, but that takes time and can be hard to do if that code is used by many other people. And besides, `age`is a nice thing to have in `user`, right?
216
+
আমরা চাইলে সকল age প্রপার্টিকে খুঁজে পরিবর্তন করতে পারি, তবে যদি আমাদের অনেক পরিবর্তন করা লাগে তাহলে তা হবে কষ্টসাধ্য। এর পাশাপাশি, আমাদের কিছু কিছু জায়গায় `age`দেখানো লাগতে পারে, তাই না?
217
217
218
-
Let's keep it.
218
+
আমরা চাই যেন এটি সঠিকভাবে কাজ করে।
219
219
220
-
Adding a getter for `age` solves the problem:
220
+
এজন্য `age` এর জন্য একটি getter ব্যবহারের মাধ্যমে সমস্যাটির সমাধান করতে পারি:
221
221
222
222
```js run no-beautify
223
223
functionUser(name, birthday) {
224
224
this.name= name;
225
225
this.birthday= birthday;
226
226
227
227
*!*
228
-
//age is calculated from the current date and birthday
228
+
//এখানে আমরা বর্তমান age ক্যাল্কুলেশন করছি
229
229
Object.defineProperty(this, "age", {
230
230
get() {
231
231
let todayYear =newDate().getFullYear();
@@ -237,8 +237,8 @@ function User(name, birthday) {
237
237
238
238
let john =newUser("John", newDate(1992, 6, 1));
239
239
240
-
alert( john.birthday ); // birthday is available
241
-
alert( john.age ); // ...as well as the age
240
+
alert( john.birthday ); // birthday কে অ্যাক্সেস করতে পারছি
241
+
alert( john.age ); // ..এবং age ও কাজ করছে
242
242
```
243
243
244
-
Now the old code works too and we've got a nice additional property.
244
+
এখন আমরা দেখছি আমাদের পুরনো স্ট্রাকচারটাকে কিভাবে নতুন স্ট্রাকচারের সাথে কাজ করাতে পারছি।
0 commit comments