Skip to content

Commit cc0f594

Browse files
authored
Merge pull request #237 from msisaifu/Property-getters-and-setters
Property getters and setters
2 parents bf26da7 + 93353a6 commit cc0f594

File tree

1 file changed

+46
-46
lines changed
  • 1-js/07-object-properties/02-property-accessors

1 file changed

+46
-46
lines changed

Diff for: 1-js/07-object-properties/02-property-accessors/article.md

+46-46
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11

2-
# Property getters and setters
2+
# প্রপার্টি getter এবং setter
33

4-
There are two kinds of object properties.
4+
জাভাস্ক্রিপ্টে অবজেক্ট প্রপার্টি দুই ধরণের।
55

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*। ইতোমধ্যে আমরা এদের দেখেছি। এই পর্যন্ত আমরা যেসব প্রপার্টি দেখেছি তাদের বলা হয় ডাটা প্রপার্টিস।
77

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* করা যায়। তবে এরা রেগুলার প্রপার্টির ন্যায় কাজ করে।
99

10-
## Getters and setters
10+
## Getters এবং setters
1111

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` দ্বারা:
1313

1414
```js
1515
let obj = {
1616
*!*get propName()*/!* {
17-
// getter, the code executed on getting obj.propName
17+
// getter, এটি এক্সিকিউট হবে যখন obj.propName কল হবে
1818
},
1919

2020
*!*set propName(value)*/!* {
21-
// setter, the code executed on setting obj.propName = value
21+
// setter, এটি এক্সিকিউট হবে যখন obj.propName = value কল হবে
2222
}
2323
};
2424
```
2525

26-
The getter works when `obj.propName` is read, the setter -- when it is assigned.
26+
অর্থাৎ getter কল হয় `obj.propName` এর মান পড়তে, এবং setter কল হয় মান অ্যাসাইন করতে।
2727

28-
For instance, we have a `user` object with `name` and `surname`:
28+
যেমন, আমাদের `user` অবজেক্টে প্রপার্টিসমূহ হল `name` এবং `surname`:
2929

3030
```js
3131
let user = {
@@ -34,7 +34,7 @@ let user = {
3434
};
3535
```
3636

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"`। অবশ্যই আমরা নামগুলো কপি-পেস্টের মাধ্যমে লিখতে চাই না, সুতরাং আমরা এর জন্য অ্যাক্সেসর ব্যবহার করতে পারি:
3838

3939
```js run
4040
let user = {
@@ -53,9 +53,9 @@ alert(user.fullName); // John Smith
5353
*/!*
5454
```
5555

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 আমাদের অন্তরালে কাজ করবে।
5757

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=`, তাহলে একটি এরর হবে:
5959

6060
```js run
6161
let user = {
@@ -65,11 +65,11 @@ let user = {
6565
};
6666

6767
*!*
68-
user.fullName = "Test"; // Error (property has only a getter)
68+
user.fullName = "Test"; // Error (কেননা প্রপার্টির জন্য শুধুমাত্র getter সংজ্ঞায়িত করা হয়েছে)
6969
*/!*
7070
```
7171

72-
Let's fix it by adding a setter for `user.fullName`:
72+
চলুন, `user.fullName` এর জন্য একটি setter ফাংশন লিখি:
7373

7474
```js run
7575
let user = {
@@ -87,29 +87,29 @@ let user = {
8787
*/!*
8888
};
8989

90-
// set fullName is executed with the given value.
90+
// এখন fullName আমাদের নতুন মানের জন্য কাজ করবে
9191
user.fullName = "Alice Cooper";
9292

9393
alert(user.name); // Alice
9494
alert(user.surname); // Cooper
9595
```
9696

97-
As the result, we have a "virtual" property `fullName`. It is readable and writable.
97+
getter এবং setter এর মাধ্যমে আমরা একটি "virtual" প্রপার্টি `fullName` ডিক্লেয়ার করেছি। যেটি পঠনযোগ্য এবং লিখনযোগ্য (readable এবং writable)।
9898

99-
## Accessor descriptors
99+
## অ্যাক্সেসর ডেস্ক্রিপ্টর
100100

101-
Descriptors for accessor properties are different from those for data properties.
101+
অ্যাক্সেসর প্রপার্টির জন্য ডেস্ক্রিপ্টর প্রপার্টি সমূহ ডাটা প্রপার্টি থেকে ভিন্ন।
102102

103-
For accessor properties, there is no `value` or `writable`, but instead there are `get` and `set` functions.
103+
অ্যাক্সেসর প্রপার্টির জন্য, কোন `value` বা `writable` ফ্ল্যাগ থাকে না, তার পরিবর্তে `get` এবং `set` ফাংশন আছে।
104104

105-
That is, an accessor descriptor may have:
105+
অ্যাক্সেসর ডেস্ক্রিপ্টর এ থাকে:
106106

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`** -- ডাটা প্রপার্টির মত কাজ করে,
111111

112-
For instance, to create an accessor `fullName` with `defineProperty`, we can pass a descriptor with `get` and `set`:
112+
যেমন, নিচের কোডে আমরা `defineProperty` এর মাধ্যমে `fullName` ডিফাইন করব, এর জন্য আমরা `get` এবং `set` ফাংশন ব্যবহার করি:
113113

114114
```js run
115115
let user = {
@@ -134,9 +134,9 @@ alert(user.fullName); // John Smith
134134
for(let key in user) alert(key); // name, surname
135135
```
136136

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` থাকে), একই সাথে অ্যাক্সেসর এবং ডাটা প্রপার্টি হবে না।
138138

139-
If we try to supply both `get` and `value` in the same descriptor, there will be an error:
139+
যদি আমরা এভাবে করতে চাই অর্থাৎ `get` এবং `value` উভয়ই যদি ডেস্ক্রিপ্টর এ ডিফাইন করি তাহলে এরর হবে:
140140

141141
```js run
142142
*!*
@@ -151,11 +151,11 @@ Object.defineProperty({}, 'prop', {
151151
});
152152
```
153153

154-
## Smarter getters/setters
154+
## স্মার্ট getters/setters
155155

156-
Getters/setters can be used as wrappers over "real" property values to gain more control over operations with them.
156+
Getters/setters দ্বারা আমরা আমাদের প্রপার্টি সমূহকে আরো বিভিন্ন ভাবে কন্ট্রোল করতে পারি।
157157

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` প্রপার্টিতে সেট করতে পারি এবং সংক্ষিপ্ত নামের জন্য একটি অ্যালার্ট দেখাতে পারি:
159159

160160
```js run
161161
let user = {
@@ -175,19 +175,19 @@ let user = {
175175
user.name = "Pete";
176176
alert(user.name); // Pete
177177

178-
user.name = ""; // Name is too short...
178+
user.name = ""; // সংক্ষিপ্ত নাম...
179179
```
180180

181-
So, the name is stored in `_name` property, and the access is done via getter and setter.
181+
সুতরাং আমাদের মূল নামটি সংরক্ষন হবে `_name` প্রপার্টি এর মধ্যে তবে আমরা `name` কে পড়ব বা অ্যাসাইন করব getter এবং setter এর দ্বারা।
182182

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` এর মান বাহির হতে পাওয়া সম্ভব।
184184

185185

186-
## Using for compatibility
186+
## কোড এর সামঞ্জস্য
187187

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+
অ্যাক্সেসরের অন্যতম দারুন একটি ব্যবহার হল এর মাধ্যমে আমরা আমাদের প্রপার্টি সমূহের ডাটা পরিবর্তন হলেও এর বিহেভিয়ার অপরিবর্তনীয় রাখতে পারি।
189189

190-
Imagine we started implementing user objects using data properties `name` and `age`:
190+
মনে করুন আমাদের একটি `User` অবজেক্ট আছে যাদের প্রপার্টি হল `name` এবং `age`:
191191

192192
```js
193193
function User(name, age) {
@@ -200,7 +200,7 @@ let john = new User("John", 25);
200200
alert( john.age ); // 25
201201
```
202202

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` সংরক্ষণ করব, কেননা এটি বেশি সুস্পষ্ট এবং সুবিধাজনক:
204204

205205
```js
206206
function User(name, birthday) {
@@ -211,21 +211,21 @@ function User(name, birthday) {
211211
let john = new User("John", new Date(1992, 6, 1));
212212
```
213213

214-
Now what to do with the old code that still uses `age` property?
214+
এখন আমাদের যেসব কোডে `age` প্রপার্টি ব্যবহার করা হয়েছে তাদের কি হবে?
215215

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` দেখানো লাগতে পারে, তাই না?
217217

218-
Let's keep it.
218+
আমরা চাই যেন এটি সঠিকভাবে কাজ করে।
219219

220-
Adding a getter for `age` solves the problem:
220+
এজন্য `age` এর জন্য একটি getter ব্যবহারের মাধ্যমে সমস্যাটির সমাধান করতে পারি:
221221

222222
```js run no-beautify
223223
function User(name, birthday) {
224224
this.name = name;
225225
this.birthday = birthday;
226226

227227
*!*
228-
// age is calculated from the current date and birthday
228+
// এখানে আমরা বর্তমান age ক্যাল্কুলেশন করছি
229229
Object.defineProperty(this, "age", {
230230
get() {
231231
let todayYear = new Date().getFullYear();
@@ -237,8 +237,8 @@ function User(name, birthday) {
237237

238238
let john = new User("John", new Date(1992, 6, 1));
239239

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 ও কাজ করছে
242242
```
243243

244-
Now the old code works too and we've got a nice additional property.
244+
এখন আমরা দেখছি আমাদের পুরনো স্ট্রাকচারটাকে কিভাবে নতুন স্ট্রাকচারের সাথে কাজ করাতে পারছি।

0 commit comments

Comments
 (0)