أنشِئ آلة حاسبة يمكن توسعتها لاحقًا
الأهمية: 5
أنشِئ دالة إنشاء باني «constructor» Calculator تُنشئ كائنات من نوع «آلة حاسبة» يمكن لنا «توسعتها».
تنقسم هذه المهمة إلى جزئين اثنين:
- أولًا، نفّذ تابِع calculate(str) يأخذ سلسلة نصية (مثل “1 + 2”) بالتنسيق «عدد مُعامل عدد» (أي مقسومة بمسافات) ويُعيد الناتج. يجب أن يفهم التابِع الجمع + والطرح -.
مثال عن الاستعمال:
```js
let calc = new Calculator;
alert( calc.calculate("3 + 7") ); // 10
```
- بعدها أضِف تابِع addMethod(name, func) يُعلّم الآلة الحاسبة عمليّة جديدة. يأخذ التابِع المُعامل name ودالة func(a,b) بوسيطين تُنفّذ هذه العملية.
كمثال على ذلك سنُضيف عمليات الضرب * والقسمة / والأُسّ **:
let
powerCalc =
new
Calculator
(
)
;
powerCalc.
addMethod
(
"*"
,
(
a,
b
)
=>
a *
b)
;
powerCalc.
addMethod
(
"/"
,
(
a,
b
)
=>
a /
b)
;
powerCalc.
addMethod
(
"**"
,
(
a,
b
)
=>
a **
b)
;
let
result =
powerCalc.
calculate
(
"2 ** 3"
)
;
alert
(
result)
;
// 8
- في هذه المهمة ليس هناك أقواس رياضية أو تعابير معقّدة.
- تفصل الأعداد والمُعامل مسافة واحدة فقط.
- يمكنك التعامل مع الأخطاء لو أردت.
- يرجى ملاحظة كيفية تخزين الطرق. تتم إضافتها ببساطة إلى خاصية
this.methods
. - يتم إجراء جميع الاختبارات والتحويلات الرقمية بطريقة
حساب '. يمكن توسيعه في المستقبل لدعم التعبيرات الأكثر تعقيدًا. في هذه المهمة نفترض أن
id` فريد. قد لا يكون هناك عنصران للصفيف بنفس “المعرف”.
يُرجى استخدام طريقة الصفيف .reduce
في الحل.
function
Calculator
(
)
{
this
.
methods =
{
"-"
:
(
a,
b
)
=>
a -
b,
"+"
:
(
a,
b
)
=>
a +
b
}
;
this
.
calculate
=
function
(
str
)
{
let
split =
str.
split
(
' '
)
,
a =
+
split[
0
]
,
op =
split[
1
]
,
b =
+
split[
2
]
;
if
(
!
this
.
methods[
op]
||
isNaN
(
a)
||
isNaN
(
b)
)
{
return
NaN
;
}
return
this
.
methods[
op]
(
a,
b)
;
}
;
this
.
addMethod
=
function
(
name,
func
)
{
this
.
methods[
name]
=
func;
}
;
}