From 47c0b5ce2f2fdc23be583b4889119c7434e603fa Mon Sep 17 00:00:00 2001 From: MaHdi Date: Mon, 8 Nov 2021 14:42:24 +0330 Subject: [PATCH 1/8] Translate a part of article --- .../07-object-properties/02-property-accessors/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index 45b9e70ed..b55fe4b42 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -1,11 +1,11 @@ -# Property getters and setters +# گیرنده و تنظیم‌کننده‌های ویژگی -There are two kinds of object properties. +ویژگی‌های شیء دو نوع هستند. -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. +نوع اول *ویژگی‌های داده‌ای* هستند. ما از قبل می‌دانیم چگونه با آن‌ها کار کنیم. تمام ویژگی‌هایی که تا حالا استفاده می‌کردیم ویژگی‌های داده‌ای بودند. -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. +نوع دوم ویژگی‌ها چیزی جدید است. این نوع *ویژگی‌های دسترسی* است. اساسا آن‌ها تابع‌هایی هستند که برای گرفتن و تنظیم‌کردن مقداری اجرا می‌شوند اما برای یک شیء خارجی مانند ویژگی‌های معمولی به نظر می‌رسند. ## Getters and setters From f12e38630fbee61d5d6becfd445abc4a1965c3a4 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Tue, 9 Nov 2021 22:41:09 +0330 Subject: [PATCH 2/8] Translate a part of article --- .../02-property-accessors/article.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index b55fe4b42..19db9db11 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -7,25 +7,25 @@ نوع دوم ویژگی‌ها چیزی جدید است. این نوع *ویژگی‌های دسترسی* است. اساسا آن‌ها تابع‌هایی هستند که برای گرفتن و تنظیم‌کردن مقداری اجرا می‌شوند اما برای یک شیء خارجی مانند ویژگی‌های معمولی به نظر می‌رسند. -## Getters and setters +## گیرنده‌ها و تنظیم‌کننده‌ها -Accessor properties are represented by "getter" and "setter" methods. In an object literal they are denoted by `get` and `set`: +ویژگی‌های دسترسی توسط متدهای «گیرنده(getter)» و «تنظیم‌کننده(setter)» نمایش داده می‌شوند. در یک شیء لیترال، این متدها با `get` و `set` مشخص می‌شوند. ```js let obj = { *!*get propName()*/!* { - // getter, the code executed on getting obj.propName + // اجرا می‌شود obj.propName گیرنده، کد آن برای دریافت }, *!*set propName(value)*/!* { - // setter, the code executed on setting obj.propName = value + // اجرا می‌شود obj.propName = value تنظیم‌کننده، کد آن برای تنظیم } }; ``` -The getter works when `obj.propName` is read, the setter -- when it is assigned. +گیرنده زمانی که `obj.propName` خوانده می‌شود کار می‌کند؛ تنظیم‌کننده زمانی که این ویژگی مقداردهی می‌شود. -For instance, we have a `user` object with `name` and `surname`: +برای مثال، ما یک شیء `user` حاوی `name` و `surname` داریم: ```js let user = { @@ -34,7 +34,7 @@ let user = { }; ``` -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: +حالا می‌خواهیم یک ویژگی `fullName` اضافه کنیم که باید `"John Smith"` باشد. قطعا، نمی‌توانیم اطلاعات موجود را کپی‌پِیست کنیم پس آن را به عنوان یک دسترسی پیاده‌سازی کنیم: ```js run let user = { @@ -53,9 +53,9 @@ alert(user.fullName); // John Smith */!* ``` -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. +از بیرون، یک ویژگی دسترسی مانند ویژگی‌ای معمولی به نظر می‌رسد. این ایده‌ی ویژگی‌های دسترسی است. ما `user.fullName` را به عنوان یک تابع *فراخوانی* نمی‌کنیم بلکه آن را به صورت عادی *دریافت* می‌کنیم: -As of now, `fullName` has only a getter. If we attempt to assign `user.fullName=`, there will be an error: +از حالا به بعد، `fullName` فقط یک گیرنده دارد. اگر ما بخواهیم `user.fullName` را مقداردهی کنیم، ارور ایجاد می‌شود: ```js run let user = { @@ -65,11 +65,11 @@ let user = { }; *!* -user.fullName = "Test"; // Error (property has only a getter) +user.fullName = "Test"; // ارور (ویژگی فقط گیرنده دارد) */!* ``` -Let's fix it by adding a setter for `user.fullName`: +بیایید با اضافه کردن تنظیم‌کننده برای `user.fullName` این مشکل را برطرف کنیم: ```js run let user = { @@ -87,14 +87,14 @@ let user = { */!* }; -// set fullName is executed with the given value. +// همراه با مقدار داده شده اجرا می‌شود set fullName user.fullName = "Alice Cooper"; alert(user.name); // Alice alert(user.surname); // Cooper ``` -As the result, we have a "virtual" property `fullName`. It is readable and writable. +در نتیجه، ما یک ویژگی «مجازیِ» `fullName` داریم. هم قابل خواندن است و هم قابل نوشتن. ## Accessor descriptors From 8f7bb07335aa25b06d2889190784de1533849264 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Wed, 10 Nov 2021 12:51:19 +0330 Subject: [PATCH 3/8] Translate a part of article --- .../02-property-accessors/article.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index 19db9db11..f3965d897 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -96,20 +96,20 @@ alert(user.surname); // Cooper در نتیجه، ما یک ویژگی «مجازیِ» `fullName` داریم. هم قابل خواندن است و هم قابل نوشتن. -## Accessor descriptors +## توصیف‌کننده‌های دسترسی -Descriptors for accessor properties are different from those for data properties. +توصیف‌کننده‌های ویژگی‌های دسترسی نسبت به توصیف‌کننده‌های ویژگی‌های داده‌ای تفاوت دارند. -For accessor properties, there is no `value` or `writable`, but instead there are `get` and `set` functions. +برای ویژگی‌های دسترسی، `value` یا `writable` وجود ندارد اما به جای آن‌ها تابع‌های `get` و `set` وجود دارد. -That is, an accessor descriptor may have: +یعنی اینکه یک توصیف‌کننده دسترسی ممکن است این‌ها را داشته باشد: -- **`get`** -- a function without arguments, that works when a property is read, -- **`set`** -- a function with one argument, that is called when the property is set, -- **`enumerable`** -- same as for data properties, -- **`configurable`** -- same as for data properties. +- **`get`** -- تابعی بدون آرگومان، زمانی که ویژگی‌ای خوانده شود کار می‌کند، +- **`set`** -- تابعی با یک آرگومان، زمانی که ویژگی تنظیم می‌شود فراخوانی می‌شود، +- **`enumerable`** -- مشابه به ویژگی‌های داده‌ای، +- **`configurable`** -- مشابه به ویژگی‌های داده‌ای، -For instance, to create an accessor `fullName` with `defineProperty`, we can pass a descriptor with `get` and `set`: +برای مثال، برای ایجاد دسترسی `fullName` با استفاده از `defineProperty`، می‌توانیم توصیف‌کننده‌ای شامل `get` و `set` قرار دهیم: ```js run let user = { @@ -134,13 +134,13 @@ alert(user.fullName); // John Smith for(let key in user) alert(key); // name, surname ``` -Please note that a property can be either an accessor (has `get/set` methods) or a data property (has a `value`), not both. +لطفا در نظر داشته باشید که یک ویژگی یا می‌تواند دسترسی باشد (دارای متدهای `get/set` است) یا یک ویژگی داده‌ای (یک `value` دارد)، نه هر دو. -If we try to supply both `get` and `value` in the same descriptor, there will be an error: +اگر ما تلاش کنیم که هم `get` و هم `value` را داخل یک توصیف‌کننده قرار دهیم، ارور ایجاد می‌شود: ```js run *!* -// Error: Invalid property descriptor. +// ارور: توصیف‌کننده غیر قابل قبول ویژگی */!* Object.defineProperty({}, 'prop', { get() { From c10e888d62977443b59db8c8c4d1cdcbcd4daac5 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Wed, 10 Nov 2021 12:59:33 +0330 Subject: [PATCH 4/8] Add some words in the beginning of lines: 107 to 110 The lines 107 to 110 were started from left, because there were English words in the beginning, and they didn't look nice. I added Persian words in the beginning, so the lines start from right. --- .../07-object-properties/02-property-accessors/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index f3965d897..60d11ec5f 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -104,10 +104,10 @@ alert(user.surname); // Cooper یعنی اینکه یک توصیف‌کننده دسترسی ممکن است این‌ها را داشته باشد: -- **`get`** -- تابعی بدون آرگومان، زمانی که ویژگی‌ای خوانده شود کار می‌کند، -- **`set`** -- تابعی با یک آرگومان، زمانی که ویژگی تنظیم می‌شود فراخوانی می‌شود، -- **`enumerable`** -- مشابه به ویژگی‌های داده‌ای، -- **`configurable`** -- مشابه به ویژگی‌های داده‌ای، +- متد **`get`** -- تابعی بدون آرگومان، زمانی که ویژگی‌ای خوانده شود کار می‌کند، +- متد **`set`** -- تابعی با یک آرگومان، زمانی که ویژگی تنظیم می‌شود فراخوانی می‌شود، +- ویژگی **`enumerable`** -- مشابه به ویژگی‌های داده‌ای، +- ویژگی **`configurable`** -- مشابه به ویژگی‌های داده‌ای، برای مثال، برای ایجاد دسترسی `fullName` با استفاده از `defineProperty`، می‌توانیم توصیف‌کننده‌ای شامل `get` و `set` قرار دهیم: From c6766c63c6bb5dbf23db4effd4da59ad1e31dd07 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Thu, 11 Nov 2021 13:50:22 +0330 Subject: [PATCH 5/8] Translate a part of article --- .../02-property-accessors/article.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index 60d11ec5f..1755f84df 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -151,11 +151,11 @@ Object.defineProperty({}, 'prop', { }); ``` -## Smarter getters/setters +## گیرنده/تنظیم‌کننده‌های هوشمندتر -Getters/setters can be used as wrappers over "real" property values to gain more control over operations with them. +گیرنده‌ها/تنظیم‌کننده‌ها می‌توانند به عنوان دربرگیرنده برای مقدار ویژگی‎های «واقعی» استفاده شوند تا کنترل بیشتری بر روی عملیات با آن‌ها داشته باشیم. -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`: +برای مثال، اگر ما بخواهیم اسم‌های خیلی کوتاه‌ها را برای `user` ممنوع کنیم، می‌توانیم یک تنظیم‌کننده `name` داشته باشیم و مقدار را درون ویژگی جداگانه‌ی `_name` ذخیره کنیم: ```js run let user = { @@ -165,7 +165,7 @@ let user = { set name(value) { if (value.length < 4) { - alert("Name is too short, need at least 4 characters"); + alert("اسم خیلی کوتاه است، حداقل به 4 کاراکتر نیاز دارد"); return; } this._name = value; @@ -175,12 +175,12 @@ let user = { user.name = "Pete"; alert(user.name); // Pete -user.name = ""; // Name is too short... +user.name = ""; // ...اسم خیلی کوتاه است ``` -So, the name is stored in `_name` property, and the access is done via getter and setter. +پس اسم در ویژگی `_name` ذخیره شده است و دسترسی گرفتن توسط گیرنده و تنظیم‌کننده انجام می‌گیرد. -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. +از لحاظ فنی، کد بیرونی می‌تواند به صورت مستقیم با استفاده از `user._name` به اسم دسترسی پیدا کند. اما یک قرارداد شناخته شده وجود دارد که ویژگی‌هایی که با یک زیرخط (underscore) `"_"` شروع می‌شوند، داخلی هستند و نباید بیرون از شیء به آن‌ها کاری داشت. ## Using for compatibility From 72cf053ce2415852740d901438d0be418f57d76c Mon Sep 17 00:00:00 2001 From: MaHdi Date: Thu, 11 Nov 2021 14:10:34 +0330 Subject: [PATCH 6/8] Typo --- 1-js/07-object-properties/02-property-accessors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index 1755f84df..0e895e68b 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -153,7 +153,7 @@ Object.defineProperty({}, 'prop', { ## گیرنده/تنظیم‌کننده‌های هوشمندتر -گیرنده‌ها/تنظیم‌کننده‌ها می‌توانند به عنوان دربرگیرنده برای مقدار ویژگی‎های «واقعی» استفاده شوند تا کنترل بیشتری بر روی عملیات با آن‌ها داشته باشیم. +گیرنده‌ها/تنظیم‌کننده‌ها می‌توانند به عنوان دربرگیرنده برای مقدار ویژگی‌های «واقعی» استفاده شوند تا کنترل بیشتری بر روی عملیات با آن‌ها داشته باشیم. برای مثال، اگر ما بخواهیم اسم‌های خیلی کوتاه‌ها را برای `user` ممنوع کنیم، می‌توانیم یک تنظیم‌کننده `name` داشته باشیم و مقدار را درون ویژگی جداگانه‌ی `_name` ذخیره کنیم: From 8d89f69fd22822b48e8ba5a9b4b60f7d4e0c8787 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Thu, 11 Nov 2021 16:59:27 +0330 Subject: [PATCH 7/8] Translate article Line 188 needs more attention --- .../02-property-accessors/article.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index 0e895e68b..e292b36ee 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -183,11 +183,11 @@ user.name = ""; // ...اسم خیلی کوتاه است از لحاظ فنی، کد بیرونی می‌تواند به صورت مستقیم با استفاده از `user._name` به اسم دسترسی پیدا کند. اما یک قرارداد شناخته شده وجود دارد که ویژگی‌هایی که با یک زیرخط (underscore) `"_"` شروع می‌شوند، داخلی هستند و نباید بیرون از شیء به آن‌ها کاری داشت. -## Using for compatibility +## استفاده برای سازگاری -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. +یکی از بهترین کاربردهای دسترسی‌ها این است که آن‌ها به ما اجازه می‌دهند که در هر زمان یک ویژگی داده‌ای «معمولی» را از طریق جایگزین کردن آن با یک گیرنده و یک تنظیم‌کننده کنترل کنیم و رفتار آن را تغییر دهیم. -Imagine we started implementing user objects using data properties `name` and `age`: +تصور کنید که ما شروع به پیاده‌سازی شیءهایی مربوط به کاربران کردیم که شامل ویژگی‌های داده‌ای `name` و `age` هستند: ```js function User(name, age) { @@ -200,7 +200,7 @@ let john = new User("John", 25); alert( john.age ); // 25 ``` -...But sooner or later, things may change. Instead of `age` we may decide to store `birthday`, because it's more precise and convenient: +...اما دیر یا زور، همه چیز ممکن است تغییر کند. به جای `age` ممکن است تصمیم بگیریم که `birthday` را ذخیره کنیم چون دقیق‌تر و مناسب‌تر است: ```js function User(name, birthday) { @@ -211,13 +211,13 @@ function User(name, birthday) { let john = new User("John", new Date(1992, 6, 1)); ``` -Now what to do with the old code that still uses `age` property? +حالا با کد قدیمی که هنوز هم از ویژگی `age` استفاده می‌کند چه کار کنیم؟ -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? +می‌توانیم چنین جاهایی را در کد پیدا و آن‌ها را درست کنیم اما این کار زمان‌بر است و اگر آن کد توسط افراد دیگری در حال استفاده باشد ممکن است این کار سخت شود. و همچنین، `age` چیز خوبی است که در `user` داشته باشیم نه؟ -Let's keep it. +بیایید آن را نگه داریم. -Adding a getter for `age` solves the problem: +اضافه کردن یک گیرنده برای `age` مشکل را حل می‌کند: ```js run no-beautify function User(name, birthday) { @@ -225,7 +225,7 @@ function User(name, birthday) { this.birthday = birthday; *!* - // age is calculated from the current date and birthday + // از تاریخ کنونی و تاریخ تولد محاسبه می‌شود age Object.defineProperty(this, "age", { get() { let todayYear = new Date().getFullYear(); @@ -237,8 +237,8 @@ function User(name, birthday) { let john = new User("John", new Date(1992, 6, 1)); -alert( john.birthday ); // birthday is available -alert( john.age ); // ...as well as the age +alert( john.birthday ); // قابل دسترس است birthday +alert( john.age ); // age درست مانند... ``` -Now the old code works too and we've got a nice additional property. +حالا کد قدیمی هم کار می‌کند و ما یک ویژگی اضافی خوب گرفتیم. From 99c06bf48804a96b3403eabcd16d2cddf9d9f934 Mon Sep 17 00:00:00 2001 From: MaHdi Date: Thu, 11 Nov 2021 22:50:24 +0330 Subject: [PATCH 8/8] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mahdyar Hasanpour Replaced «گیرنده» with "getter" Replaced «تنظیم‌کننده» with "setter" Replaced «دسترسی» with «اکسسر» And some small changes: - Fixed a typo in line 203 - Also changed a word in lines 108 and 143 --- .../02-property-accessors/article.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/1-js/07-object-properties/02-property-accessors/article.md b/1-js/07-object-properties/02-property-accessors/article.md index e292b36ee..2a2d971bb 100644 --- a/1-js/07-object-properties/02-property-accessors/article.md +++ b/1-js/07-object-properties/02-property-accessors/article.md @@ -1,29 +1,29 @@ -# گیرنده و تنظیم‌کننده‌های ویژگی +# متدهای getter و setter ویژگی ویژگی‌های شیء دو نوع هستند. نوع اول *ویژگی‌های داده‌ای* هستند. ما از قبل می‌دانیم چگونه با آن‌ها کار کنیم. تمام ویژگی‌هایی که تا حالا استفاده می‌کردیم ویژگی‌های داده‌ای بودند. -نوع دوم ویژگی‌ها چیزی جدید است. این نوع *ویژگی‌های دسترسی* است. اساسا آن‌ها تابع‌هایی هستند که برای گرفتن و تنظیم‌کردن مقداری اجرا می‌شوند اما برای یک شیء خارجی مانند ویژگی‌های معمولی به نظر می‌رسند. +نوع دوم ویژگی‌ها چیزی جدید است. این نوع *ویژگی‌های اکسسر(accessor)* است. اساسا آن‌ها تابع‌هایی هستند که برای گرفتن و تنظیم‌کردن مقداری اجرا می‌شوند اما برای یک شیء خارجی مانند ویژگی‌های معمولی به نظر می‌رسند. -## گیرنده‌ها و تنظیم‌کننده‌ها +## متدهای getter و setter -ویژگی‌های دسترسی توسط متدهای «گیرنده(getter)» و «تنظیم‌کننده(setter)» نمایش داده می‌شوند. در یک شیء لیترال، این متدها با `get` و `set` مشخص می‌شوند. +ویژگی‌های اکسسر توسط متدهای "getter" و "setter" نمایش داده می‌شوند. در یک شیء لیترال، این متدها با `get` و `set` مشخص می‌شوند. ```js let obj = { *!*get propName()*/!* { - // اجرا می‌شود obj.propName گیرنده، کد آن برای دریافت + // اجرا می‌شود obj.propName کد آن برای دریافت ،getter }, *!*set propName(value)*/!* { - // اجرا می‌شود obj.propName = value تنظیم‌کننده، کد آن برای تنظیم + // اجرا می‌شود obj.propName = value کد آن برای تنظیم ،setter } }; ``` -گیرنده زمانی که `obj.propName` خوانده می‌شود کار می‌کند؛ تنظیم‌کننده زمانی که این ویژگی مقداردهی می‌شود. +متد getter زمانی که `obj.propName` خوانده می‌شود کار می‌کند؛ متد setter زمانی که این ویژگی مقداردهی می‌شود. برای مثال، ما یک شیء `user` حاوی `name` و `surname` داریم: @@ -34,7 +34,7 @@ let user = { }; ``` -حالا می‌خواهیم یک ویژگی `fullName` اضافه کنیم که باید `"John Smith"` باشد. قطعا، نمی‌توانیم اطلاعات موجود را کپی‌پِیست کنیم پس آن را به عنوان یک دسترسی پیاده‌سازی کنیم: +حالا می‌خواهیم یک ویژگی `fullName` اضافه کنیم که باید `"John Smith"` باشد. قطعا، نمی‌توانیم اطلاعات موجود را کپی‌پِیست کنیم پس می‌توانیم آن را به عنوان یک اکسسر پیاده‌سازی کنیم: ```js run let user = { @@ -53,9 +53,9 @@ alert(user.fullName); // John Smith */!* ``` -از بیرون، یک ویژگی دسترسی مانند ویژگی‌ای معمولی به نظر می‌رسد. این ایده‌ی ویژگی‌های دسترسی است. ما `user.fullName` را به عنوان یک تابع *فراخوانی* نمی‌کنیم بلکه آن را به صورت عادی *دریافت* می‌کنیم: +از بیرون، یک ویژگی اکسسر مانند ویژگی‌ای معمولی به نظر می‌رسد. این ایده‌ی ویژگی‌های اکسسر است. ما `user.fullName` را به عنوان یک تابع *فراخوانی* نمی‌کنیم بلکه آن را به صورت عادی *دریافت* می‌کنیم: -از حالا به بعد، `fullName` فقط یک گیرنده دارد. اگر ما بخواهیم `user.fullName` را مقداردهی کنیم، ارور ایجاد می‌شود: +از حالا به بعد، `fullName` فقط یک getter دارد. اگر ما بخواهیم `user.fullName` را مقداردهی کنیم، ارور ایجاد می‌شود: ```js run let user = { @@ -65,11 +65,11 @@ let user = { }; *!* -user.fullName = "Test"; // ارور (ویژگی فقط گیرنده دارد) +user.fullName = "Test"; // (دارد getter ویژگی فقط) ارور */!* ``` -بیایید با اضافه کردن تنظیم‌کننده برای `user.fullName` این مشکل را برطرف کنیم: +بیایید با اضافه کردن setter برای `user.fullName` این مشکل را برطرف کنیم: ```js run let user = { @@ -96,20 +96,20 @@ alert(user.surname); // Cooper در نتیجه، ما یک ویژگی «مجازیِ» `fullName` داریم. هم قابل خواندن است و هم قابل نوشتن. -## توصیف‌کننده‌های دسترسی +## توصیف‌کننده‌های اکسسر -توصیف‌کننده‌های ویژگی‌های دسترسی نسبت به توصیف‌کننده‌های ویژگی‌های داده‌ای تفاوت دارند. +توصیف‌کننده‌های ویژگی‌های اکسسز نسبت به توصیف‌کننده‌های ویژگی‌های داده‌ای تفاوت دارند. -برای ویژگی‌های دسترسی، `value` یا `writable` وجود ندارد اما به جای آن‌ها تابع‌های `get` و `set` وجود دارد. +برای ویژگی‌های اکسسر، `value` یا `writable` وجود ندارد اما به جای آن‌ها تابع‌های `get` و `set` وجود دارد. -یعنی اینکه یک توصیف‌کننده دسترسی ممکن است این‌ها را داشته باشد: +یعنی اینکه یک توصیف‌کننده اکسسز ممکن است این‌ها را داشته باشد: - متد **`get`** -- تابعی بدون آرگومان، زمانی که ویژگی‌ای خوانده شود کار می‌کند، -- متد **`set`** -- تابعی با یک آرگومان، زمانی که ویژگی تنظیم می‌شود فراخوانی می‌شود، +- متد **`set`** -- تابعی با یک آرگومان، زمانی که ویژگی مقداردهی می‌شود فراخوانی می‌شود، - ویژگی **`enumerable`** -- مشابه به ویژگی‌های داده‌ای، - ویژگی **`configurable`** -- مشابه به ویژگی‌های داده‌ای، -برای مثال، برای ایجاد دسترسی `fullName` با استفاده از `defineProperty`، می‌توانیم توصیف‌کننده‌ای شامل `get` و `set` قرار دهیم: +برای مثال، برای ایجاد اکسسر `fullName` با استفاده از `defineProperty`، می‌توانیم توصیف‌کننده‌ای شامل `get` و `set` قرار دهیم: ```js run let user = { @@ -134,13 +134,13 @@ alert(user.fullName); // John Smith for(let key in user) alert(key); // name, surname ``` -لطفا در نظر داشته باشید که یک ویژگی یا می‌تواند دسترسی باشد (دارای متدهای `get/set` است) یا یک ویژگی داده‌ای (یک `value` دارد)، نه هر دو. +لطفا در نظر داشته باشید که یک ویژگی یا می‌تواند اکسسر باشد (دارای متدهای `get/set` است) یا یک ویژگی داده‌ای (یک `value` دارد)، نه هر دو. اگر ما تلاش کنیم که هم `get` و هم `value` را داخل یک توصیف‌کننده قرار دهیم، ارور ایجاد می‌شود: ```js run *!* -// ارور: توصیف‌کننده غیر قابل قبول ویژگی +// ارور: توصیف‌کننده‌ی غیر قابل قبول ویژگی */!* Object.defineProperty({}, 'prop', { get() { @@ -151,11 +151,11 @@ Object.defineProperty({}, 'prop', { }); ``` -## گیرنده/تنظیم‌کننده‌های هوشمندتر +## متدهای getter/setter هوشمندتر -گیرنده‌ها/تنظیم‌کننده‌ها می‌توانند به عنوان دربرگیرنده برای مقدار ویژگی‌های «واقعی» استفاده شوند تا کنترل بیشتری بر روی عملیات با آن‌ها داشته باشیم. +متدهای getter/setter می‌توانند به عنوان دربرگیرنده برای مقدار ویژگی‌های «واقعی» استفاده شوند تا کنترل بیشتری بر روی عملیات با آن‌ها داشته باشیم. -برای مثال، اگر ما بخواهیم اسم‌های خیلی کوتاه‌ها را برای `user` ممنوع کنیم، می‌توانیم یک تنظیم‌کننده `name` داشته باشیم و مقدار را درون ویژگی جداگانه‌ی `_name` ذخیره کنیم: +برای مثال، اگر ما بخواهیم اسم‌های خیلی کوتاه‌ها را برای `user` ممنوع کنیم، می‌توانیم یک setter `name` داشته باشیم و مقدار را درون ویژگی جداگانه‌ی `_name` ذخیره کنیم: ```js run let user = { @@ -178,14 +178,14 @@ alert(user.name); // Pete user.name = ""; // ...اسم خیلی کوتاه است ``` -پس اسم در ویژگی `_name` ذخیره شده است و دسترسی گرفتن توسط گیرنده و تنظیم‌کننده انجام می‌گیرد. +پس اسم در ویژگی `_name` ذخیره شده است و دسترسی گرفتن توسط getter و setter انجام می‌گیرد. از لحاظ فنی، کد بیرونی می‌تواند به صورت مستقیم با استفاده از `user._name` به اسم دسترسی پیدا کند. اما یک قرارداد شناخته شده وجود دارد که ویژگی‌هایی که با یک زیرخط (underscore) `"_"` شروع می‌شوند، داخلی هستند و نباید بیرون از شیء به آن‌ها کاری داشت. ## استفاده برای سازگاری -یکی از بهترین کاربردهای دسترسی‌ها این است که آن‌ها به ما اجازه می‌دهند که در هر زمان یک ویژگی داده‌ای «معمولی» را از طریق جایگزین کردن آن با یک گیرنده و یک تنظیم‌کننده کنترل کنیم و رفتار آن را تغییر دهیم. +یکی از بهترین کاربردهای اکسسرها این است که آن‌ها به ما اجازه می‌دهند که در هر زمان یک ویژگی داده‌ای «معمولی» را از طریق جایگزین کردن آن با یک getter و یک setter کنترل کنیم و رفتار آن را تغییر دهیم. تصور کنید که ما شروع به پیاده‌سازی شیءهایی مربوط به کاربران کردیم که شامل ویژگی‌های داده‌ای `name` و `age` هستند: @@ -200,7 +200,7 @@ let john = new User("John", 25); alert( john.age ); // 25 ``` -...اما دیر یا زور، همه چیز ممکن است تغییر کند. به جای `age` ممکن است تصمیم بگیریم که `birthday` را ذخیره کنیم چون دقیق‌تر و مناسب‌تر است: +...اما دیر یا زود، همه چیز ممکن است تغییر کند. به جای `age` ممکن است تصمیم بگیریم که `birthday` را ذخیره کنیم چون دقیق‌تر و مناسب‌تر است: ```js function User(name, birthday) { @@ -217,7 +217,7 @@ let john = new User("John", new Date(1992, 6, 1)); بیایید آن را نگه داریم. -اضافه کردن یک گیرنده برای `age` مشکل را حل می‌کند: +اضافه کردن یک getter برای `age` مشکل را حل می‌کند: ```js run no-beautify function User(name, birthday) {