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/01-object/article.md
+43-43Lines changed: 43 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,11 +1,11 @@
1
1
2
2
# الكائنات
3
3
4
-
كما عرفنا من فصل[أنواع البيانات](info:types), هنالك ثماني أنواع للبيانات في الجافا اسكريبت.سبعة منهم يسمون "أوليةprimitive",لأن قيمهم تحتوي شيئا واحداً (لتكن سلسلة نصية أو رقم أو أي شيْ)
4
+
كما عرفنا من فصل[أنواع البيانات](info:types)، هنالك ثماني أنواع للبيانات في الجافاسكريبت. سبعة منهم يسمون "أولية primitive"، لأن قيمهم تحتوي شيئا واحداً (لتكن سلسلة نصية أو رقم أو أي شيْء).
5
5
6
-
في المقابل,تستخدم الكائنات لحفظ مجموعات keyed collections من مختلف البيانات و الكيانات المركبة.في الجافا اسكريبت,تدخل الكائنات تقريبا في كل جانب من جوانب اللغة. لذا يتوجب علينا فهمها قبل التعمق في أي شيئ آخر.
6
+
في المقابل، تستخدم الكائنات لحفظ مجموعات keyed collections من مختلف البيانات والكيانات المركبة.في الجافاسكريبت، تدخل الكائنات تقريبا في كل جانب من جوانب اللغة. لذا يتوجب علينا فهمها قبل التعمق في أي شيء آخر.
7
7
8
-
يمكن إنشاء أي كائن باستخدام الأقواس المعقوصة`{…}` مع قائمة اختيارية بالخاصيات. الخاصية هي زوج من "مفتاح: قيمة" (`key: value`) إذ يكون المفتاح عبارة عن نص (يُدعى "اسم الخاصية")، والقيمة يمكن أن تكون أي شيء.
8
+
يمكن إنشاء أي كائن باستخدام الأقواس المعقوفة`{…}` مع قائمة اختيارية بالخاصيات. الخاصية هي زوج من "مفتاح: قيمة" (`key: value`) إذ يكون المفتاح عبارة عن نص (يُدعى "اسم الخاصية")، والقيمة يمكن أن تكون أي شيء.
9
9
10
10
يمكننا تخيل الكائن كخزانة تحوي ملفات. يُخزن كل جزء من هذه البيانات في الملف الخاص به باستخدام المفتاح. يمكن إيجاد، أو إضافة، أو حذف ملف باستخدام اسمه.
11
11
@@ -20,7 +20,7 @@ let user = {}; // "object literal" syntax
20
20
21
21

22
22
23
-
تُستخدم الأقواس المعقوصة`{...}` عادة، وهذا النوع من التصريح يُسمى «*الصياغة المختصرة لتعريف كائن*» (*object literal*).
23
+
تُستخدم الأقواس المعقوفة`{...}` عادة، وهذا النوع من التصريح يُسمى «*الصياغة المختصرة لتعريف كائن*» (*object literal*).
24
24
25
25
## القيم المُجرَّدة والخاصيات
26
26
@@ -90,10 +90,10 @@ let user = {
90
90
age:30*!*,*/!*
91
91
}
92
92
```
93
-
وهذا يسمى فاصلة "زائدة" أو "معلقة". يجعل من السهل إضافة / إزالة / نقل الخصائص، لأن جميع الأسطر تصبح متشابهة.
93
+
وهذا يسمى فاصلة "زائدة" أو "معلقة". يجعل من السهل إضافة، إزالة، ونقل الخصائص، لأن جميع الأسطر تصبح متشابهة.
94
94
95
95
````smart header="الكائن المعرف بأنه ثابت يمكنه أن يتغير"
96
-
يرجى ملاحظة: يمكن تعديل كائن معلن على أنه ثابت.
96
+
ملاحظة: يمكن تعديل كائن معلن على أنه ثابت.
97
97
98
98
مثلاً:
99
99
@@ -109,11 +109,11 @@ user.name = "Pete"; // (*)
109
109
alert(user.name); // Pete
110
110
```
111
111
112
-
قد يبدو أن الخط `(*)` سيسبب خطأ، لكن لا. يُحدِّد "const" قيمة "user"، وليس إصلاح محتوياتها.
112
+
قد يبدو أن الخط `(*)` سيسبب خطأ، لكن ذلك لن يحدث. يُحدِّد "const" قيمة "user"، وليس إصلاح محتوياتها.
113
113
114
-
لن يُظهر "const" خطأ إلا إذا حاولنا تعيين "user = ...` ككل.
114
+
لن يُظهر "const" خطأ إلا إذا حاولنا تعيين "user = ...` كله.
115
115
116
-
هناك طريقة أخرى لعمل خصائص كائن ثابتة، وسنتناولها لاحقًا في الفصل<info:property-descriptors>.
116
+
هناك طريقة أخرى لخلق خصائص كائن ثابتة، وسنتناولها لاحقًا في الفصل<info:property-descriptors>.
117
117
````
118
118
119
119
## الأقواس المربعة
@@ -125,11 +125,11 @@ alert(user.name); // Pete
125
125
user.likes birds =true
126
126
```
127
127
128
-
لا تفهم الجافا اسكريبت هذه الصيغه. يعتقد أننا نتعامل مع "user.likes"، ثم تعطي خطأ في بناء الجملة عندما يصادف "birds" غير متوقعة
128
+
لا تفهم الجافاسكريبت هذه الصيغه. يعتقد أننا نتعامل مع "user.likes"، ثم تعطي خطأ في بناء الجملة عندما يصادف "birds" غير متوقعة.
129
129
130
-
تتطلب النقطة أن يكون المفتاح معرفًا متغيرًا صالحًا. هذا يعني: أنه لا يحتوي على مسافات، ولا يبدأ برقم ولا يتضمن أحرفًا خاصة (يُسمح بـ `$` و` _`).
130
+
تتطلب النقطة أن يكون المفتاح معرفًا متغيرًا صالحًا. هذا يعني: أنه لا يحتوي على مسافات، ولا يبدأ برقم ولا يتضمن أحرفًا خاصة (يُسمح بـ `$` و` _`).
131
131
132
-
هناك بديل "رمز القوس المربع" يعمل مع أي سلسلة:
132
+
هناك بديل "رمز القوس المربع" الذي يعمل مع أي سلسلة:
133
133
134
134
```js run
135
135
let user = {};
@@ -146,7 +146,7 @@ delete user["likes birds"];
146
146
147
147
الآن كل شيء على ما يرام. يرجى ملاحظة أن السلسلة داخل الأقواس مقتبسة بشكل صحيح (أي نوع من علامات الاقتباس ستفعل).
148
148
149
-
توفر الأقواس المربعة أيضًا جلب اسم خاصية ناتجة عن قيمة أي تعبير - على عكس السلسلة الحرفية- مثل المتغير كما يلي:
149
+
توفر الأقواس المربعة أيضًا جلب اسم خاصية ناتجة عن قيمة أي تعبير -على عكس السلسلة الحرفية- مثل المتغير كما يلي:
150
150
151
151
```js
152
152
let key ="likes birds";
@@ -155,7 +155,7 @@ let key = "likes birds";
155
155
user[key] =true;
156
156
```
157
157
158
-
هنا, المتغير`key` يمكن حسابه وقت التنفيذ run-time أو اعتمادا على ما يدخله المستخدم. من ثم نستخدمها للوصول إلى الخاصية.وهذا يمنحنا قدراً كبيراً من المرونة.
158
+
هنا, المتغير`key` يمكن حسابه وقت التنفيذ (run-time) أو اعتمادا على ما يدخله المستخدم. من ثم نستخدمها للوصول إلى الخاصية.وهذا يمنحنا قدراً كبيراً من المرونة.
159
159
160
160
مثلاً:
161
161
@@ -201,9 +201,9 @@ let bag = {
201
201
alert( bag.apple ); // 5 if fruit="apple"
202
202
```
203
203
204
-
معنى computed property بسيط: `[fruit]` تعني أن اسم الخاصية يجب أن يؤخذ من `fruit`.
204
+
معنى computed property سهل: `[fruit]` تعني أن اسم الخاصية يجب أن يؤخذ من `fruit`.
205
205
206
-
لذا, إذا أدخل الزائر `"apple"`,`bag` ستتحول `{apple: 5}`.
206
+
لذا, إذا أدخل الزائر `"apple"`،`bag` ستتحول `{apple: 5}`.
207
207
208
208
يعمل الأمر السابق بالطريقة التالية ذاتها:
209
209
```js run
@@ -225,13 +225,13 @@ let bag = {
225
225
};
226
226
```
227
227
228
-
الأقواس المربعة أقوى بكثير من استخدام الصيغة النُقطية.حيث تسمح باستخدام أي أسماء خصائص و متغيرات. لكنها أيضا أكثر إرهاقاً في الكتابة.
228
+
الأقواس المربعة أقوى بكثير من استخدام الصيغة النُقطية.حيث تسمح باستخدام أي أسماء خصائص ومتغيرات. لكنها أيضا أكثر إرهاقاً في الكتابة.
229
229
230
-
لذلك معظم الوقت, حينما يكون اسم خاصية معروفا أو بسيطا, تستخدم الصيغة النُقطية. وإذا أردنا شيئاً أكثر تعقيدا, ننتقل إلى استخدام الأقواس المربعة.
230
+
لذلك، معظم الوقت، حينما يكون اسم خاصية معروفا أو غير مركب، تستخدم الصيغة النُقطية. وإذا أردنا شيئاً أكثر تعقيدا، ننتقل إلى استخدام الأقواس المربعة.
231
231
232
-
## اختصار قيمة الخاصية(Property value shorthand)
232
+
## اختصار قيمة الخاصية(Property value shorthand)
233
233
234
-
في الكود الحقيقي ، غالبًا ما نستخدم المتغيرات الموجودة كقيم لأسماء الخصائص.
234
+
في الشيفرة الحقيقية، غالبًا ما نستخدم المتغيرات الموجودة بصفتها قيَمًا لأسماء الخصائص.
235
235
236
236
مثلاً:
237
237
@@ -248,9 +248,9 @@ let user = makeUser("John", 30);
248
248
alert(user.name); // John
249
249
```
250
250
251
-
في المثال السابق, تمتلك الخصائص نفس أسماء المتغيرات. حالة عمل خاصية من متغير هي أمر شائع جدا, that ذلك أنه من المميز وجود *اختصار قيمة الخاصية* لجعلها مختصرة .
251
+
في المثال السابق، تمتلك الخصائص نفس أسماء المتغيرات. حالة عمل خاصية من متغير هي أمر شائع جدا، that ذلك أنه من المميز وجود *اختصار قيمة الخاصية* لجعلها مختصرة .
252
252
253
-
بدلاً من `name:name` يمكننا فقط كتابة `name`, كهذا المثال:
253
+
بدلاً من `name:name` يمكننا فقط كتابة `name`، كهذا المثال:
254
254
255
255
```js
256
256
functionmakeUser(name, age) {
@@ -264,7 +264,7 @@ function makeUser(name, age) {
264
264
}
265
265
```
266
266
267
-
يمكننا استخدام كل من الخصائص العادية و والاختصارات كليهما في نفس الكائن object :
267
+
يمكننا استخدام كل من الخصائص العادية والاختصارات كليهما في نفس الكائن:
268
268
269
269
```js
270
270
let user = {
@@ -276,9 +276,9 @@ let user = {
276
276
277
277
## قيود أسماء الخصائص Property names limitations
278
278
279
-
كما نعلم, لا يمكن للمتغير أن يمتلك اسماً يساوي واحداً من الكلمات المحفوظة للغة language-reserved words مثل "for", "let", "return" إلخ.
279
+
كما نعلم، لا يمكن للمتغير أن يمتلك اسماً يساوي واحداً من الكلمات المحفوظة للغة (language-reserved words) مثل "for", "let", "return" إلخ.
280
280
281
-
لكن بالنسبة لخاصية في كائن, لا توجد مثل هذه القيود:
281
+
لكن بالنسبة لخاصية في كائن، لا توجد مثل هذه القيود:
باختصار, ليس هناك أي قيود لأسماء الخصائص property names. يمكن أن يكونوا أي حرف أو رمز (نوع مميز من identifiers, سيتم الحديث عنه لاحقاً).
295
+
باختصار، ليس هناك أي قيود لأسماء الخصائص. يمكنها أن تكون أي حرف أو رمز (نوع مميز من identifiers، سيتم الحديث عنه لاحقاً).
296
296
297
297
الأنواع الأخرى تتحول تلقائياً لسلاسل نصية strings.
298
298
299
-
مثلاً, رقم `0` يتحول إلى حرف `"0"` عند استخدامه كاسم خاصية property key:
299
+
مثلاً, رقم `0` يتحول إلى حرف `"0"` عند استخدامه اسما لخاصية:
300
300
301
301
```js run
302
302
let obj = {
@@ -316,13 +316,13 @@ obj.__proto__ = 5; // assign a number
316
316
alert(obj.__proto__); // [object Object] - the value is an object, didn't work as intended
317
317
```
318
318
319
-
كما نرى من الكود , إعطاء قيمة أولية primitive`5` يتم تجاهلها.
319
+
كما نرى في الشيفرة أعلاه، إعطاء قيمة أولية `5` يتم تجاهلها.
320
320
321
-
سوف نغطي طبيعة `__proto__` في [subsequent chapters](info:prototype-inheritance), واقتراح [ways to fix](info:prototype-methods) مثل هذا السلوك.
321
+
سوف نغطي طبيعة `__proto__` في [subsequent chapters](info:prototype-inheritance)، واقتراح [ways to fix](info:prototype-methods) مثل هذا السلوك.
322
322
323
-
## فحص الكينونة, "in" معامل
323
+
## فحص الكينونة، "in" معامل
324
324
325
-
ميزة ملحوظة للكائنات في الجافا اسكريبت ، مقارنة بالعديد من اللغات الأخرى، هي أنه من الممكن الوصول إلى أي خاصية. لن يكون هناك خطأ إذا كانت الخاصية غير موجودة!
325
+
ميزة ملحوظة للكائنات في الجافاسكريبت، مقارنة بالعديد من اللغات الأخرى، هي أنه من الممكن الوصول إلى أي خاصية. لن يكون هناك خطأ إذا كانت الخاصية غير موجودة!
326
326
327
327
328
328
قراءة خاصية غير موجودة تُرجع فقط "غير محدد". لذا يمكننا بسهولة اختبار ما إذا كانت الخاصية موجودة:
@@ -333,7 +333,7 @@ let user = {};
333
333
alert( user.noSuchProperty===undefined ); // "تحقق هذه الموازنة يشير إلى "عدم وجود الخاصية
334
334
```
335
335
336
-
يوجد أيضا مُعامل خاصة `"in"` لفحص تواجد أي خاصية.
336
+
يوجد أيضا مُعامل خاصة `"in"` لفحص وجود أي خاصية.
337
337
338
338
The syntax is:
339
339
```js
@@ -351,7 +351,7 @@ alert( "blabla" in user ); // false, user.blabla غير موجود
351
351
352
352
يرجى ملاحظة أنه في الجهة اليسرى من `in` يجب أن يكون هناك *اسم خاصية*. يكون عادة نصًا بين علامتي تنصيص.
353
353
354
-
إذا حذفنا علامات التنصيص، فهذا يعني متغيرًا، يجب أن يحتوي على الاسم الفعلي المراد اختباره. على سبيل المثال:
354
+
إذا حذفنا علامات التنصيص، فهذا يعني متغيرًا، يجب أن يحتوي على الاسم الفعلي المراد اختباره. على سبيل المثال:
355
355
356
356
```js run
357
357
let user = { age:30 };
@@ -362,9 +362,9 @@ alert( *!*key*/!* in user ); // true, خاصية "age" موجودة
362
362
363
363
لماذا يوجد المعامل `in`? أليس من الكافي المقارنة مقابل `undefined`?
364
364
365
-
حسناً, في معظم الأحيان المقارنة ب `undefined` تكون جيدة. ولكن هناك حالة خاصة عندما تفشل, لكن `"in"` تعمل بشكل صحيح.
365
+
حسناً، في معظم الأحيان المقارنة بـ`undefined` تكون جيدة. ولكن هناك حالة خاصة عندما تفشل، لكن `"in"` تعمل بشكل صحيح.
366
366
367
-
يحدث ذلك عند وجود خاصية داخل كائن، ولكنها تخزن قيمة `undefined`:
367
+
يحدث ذلك عند وجود خاصية داخل كائن، ولكنها تخزن قيمة `undefined`:
368
368
369
369
```js run
370
370
let obj = {
@@ -376,24 +376,24 @@ alert( obj.test ); // تعطي undefined, لذلك - ألا توجد هذه ال
376
376
alert( "test"in obj ); // true, الخاصية موجودة بالفعل!
377
377
```
378
378
379
-
في الكود السابق, الخاصية `obj.test` موجودة بالفعل. لذا معامل `in`يعمل بشكل صحيح.
379
+
في الشيفرة السابقة، الخاصية `obj.test` موجودة بالفعل. لذا معامل `in`يعمل بشكل صحيح.
380
380
381
-
مواقف كهذه تحدث نادراً, لأن `undefined` لا ينبغي تعيينها بشكل ذاتي. عادة ما نستخدم `null`ل "unknown" أو "empty" قيم . لذا معامل `in` يعتبر ضيفاً غريباً في الكود.
381
+
مواقف مثل هذه تحدث نادراً، لأن `undefined` لا ينبغي تعيينها بشكل ذاتي. عادة ما نستخدم `null`للقيم غير المعروفة أو الفارغة. لذا معامل `in` يعتبر ضيفاً غريباً في الشيفرة.
382
382
383
383
384
384
## The "for..in" loop
385
385
386
-
للمرور على كل مفاتيح الكائن, يوجد شكل خاص آخر للحلقة loop: `for..in`. هذه الحلقة مختلفة تمامًا عما درسناه سابقًا، أي الحلقة `for(;;)`.
386
+
للمرور على كل مفاتيح الكائن، يوجد شكل خاص آخر للحلقة loop: `for..in`. هذه الحلقة مختلفة تمامًا عما درسناه سابقًا، أي الحلقة `for(;;)`.
387
387
388
-
طريقة الكتابة في الكود:
388
+
طريقة الكتابة في الشيفرة:
389
389
390
390
```js
391
391
for (key in object) {
392
392
//يتنفذ ما بداخل الحلقة لكل مفتاح ضمن خاصيات الكائن
393
393
}
394
394
```
395
395
396
-
مثلاً, لنطبع جميع خاصيات الكائن `user`:
396
+
مثلاً، لنطبع جميع خاصيات الكائن `user`:
397
397
398
398
```js run
399
399
let user = {
@@ -410,13 +410,13 @@ for (let key in user) {
410
410
}
411
411
```
412
412
413
-
لاحظ أن جميع تراكيب "for" تتيح لنا تعريف متغير التكرار بِداخل الحلقة، مثل `let key` في المثال السابق,.
413
+
لاحظ أن جميع تراكيب "for" تتيح لنا تعريف متغير التكرار بِداخل الحلقة، مثل `let key` في المثال السابق.
414
414
415
-
أيضاً, يمكننا استخدام اسم متغير آخر بدلا من `key`. مثلا,`"for (let prop in obj)"` مستخدم أيضاَ بكثرة.
415
+
أيضاً، يمكننا استخدام اسم متغير آخر بدلا من `key`. مثلا،`"for (let prop in obj)"` مستخدم أيضاَ بكثرة.
416
416
417
417
### الترتيب مثل الكائنات
418
418
419
-
هل الكائنات مرتبة? بمعنى آخر, إن تنقلنا في حلقة خلال كائن, هل نحصل على جميع الخاصيات بنفس الترتيب الذي أُضيفت به؟ وهل يمكننا الاعتماد على هذا؟
419
+
هل الكائنات مرتبة؟ بمعنى آخر، إن تنقلنا في حلقة خلال كائن، هل نحصل على جميع الخاصيات بنفس الترتيب الذي أُضيفت به؟ وهل يمكننا الاعتماد على هذا؟
420
420
421
421
The short answer is: "ordered in a special fashion": integer properties are sorted, others appear in creation order. The details follow.
0 commit comments