From 70ac9b9dd9dac8755e623f14d2614c53de71bfba Mon Sep 17 00:00:00 2001 From: Andrea Longo Date: Tue, 2 Mar 2021 21:19:04 +0100 Subject: [PATCH 1/4] translated article --- 1-js/09-classes/05-extend-natives/article.md | 48 ++++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/1-js/09-classes/05-extend-natives/article.md b/1-js/09-classes/05-extend-natives/article.md index dba4df472..5f2abbd61 100644 --- a/1-js/09-classes/05-extend-natives/article.md +++ b/1-js/09-classes/05-extend-natives/article.md @@ -1,12 +1,12 @@ -# Extending built-in classes +# Estendere le classi built-in -Built-in classes like Array, Map and others are extendable also. +Le classi built-in (integrate) come Array, Map e tutte le altre, sono anch'esse estendibili. -For instance, here `PowerArray` inherits from the native `Array`: +Ad esempio, qui vediamo `PowerArray` ereditare dall'`Array` nativo: ```js run -// add one more method to it (can do more) +// aggiungiamo un metodo (possiamo fare di più) class PowerArray extends Array { isEmpty() { return this.length === 0; @@ -21,20 +21,20 @@ alert(filteredArr); // 10, 50 alert(filteredArr.isEmpty()); // false ``` -Please note a very interesting thing. Built-in methods like `filter`, `map` and others -- return new objects of exactly the inherited type `PowerArray`. Their internal implementation uses the object's `constructor` property for that. +Notiamo una cosa interessante. I metodi built-in come like `filter`, `map` e cosi via -- ritornano nuovi esattamente del nuovo tipo ereditato, cioè `PowerArray`. La loro implementazione interna utilizzata il `costruttore` per farlo. -In the example above, +Nell'esempio sopra, ```js arr.constructor === PowerArray ``` -When `arr.filter()` is called, it internally creates the new array of results using exactly `arr.constructor`, not basic `Array`. That's actually very cool, because we can keep using `PowerArray` methods further on the result. +Quando invochiamo `arr.filter()`, questo creerà internamente il nuovo array contenente i risultati utilizzando `arr.constructor`, non l'`Array` standard. Questo è molto utile, poiché possiamo continuare ad utilizzare i metodi di `PowerArray` anche dopo aver ottenuto il risultato. -Even more, we can customize that behavior. +Ancora meglio, possiamo personalizzarne il comportamento. -We can add a special static getter `Symbol.species` to the class. If it exists, it should return the constructor that JavaScript will use internally to create new entities in `map`, `filter` and so on. +Possiamo aggiungre uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore utilizzerà internamente per creare le nuove entità in `map`, `filter` e gli altri metodi. -If we'd like built-in methods like `map` or `filter` to return regular arrays, we can return `Array` in `Symbol.species`, like here: +Se invece, la nostra intenzione è quella di restituire degli array standard tramite l'utilizzo dei metodi come `map` o `filter`, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: ```js run class PowerArray extends Array { @@ -43,7 +43,7 @@ class PowerArray extends Array { } *!* - // built-in methods will use this as the constructor + // i metodi built-in lo utilizzeranno come costruttore static get [Symbol.species]() { return Array; } @@ -53,35 +53,35 @@ class PowerArray extends Array { let arr = new PowerArray(1, 2, 5, 10, 50); alert(arr.isEmpty()); // false -// filter creates new array using arr.constructor[Symbol.species] as constructor +// filter crea un nuovo array utilizzando arr.constructor[Symbol.species] come costruttore let filteredArr = arr.filter(item => item >= 10); *!* -// filteredArr is not PowerArray, but Array +// filteredArr non è di tipo PowerArray, ma è un Array standard */!* alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function ``` -As you can see, now `.filter` returns `Array`. So the extended functionality is not passed any further. +Come potete osservare, ora `.filter` restituisce un `Array`. Quindi l'estensione delle funzionalità non sarà più disponibile. -```smart header="Other collections work similarly" -Other collections, such as `Map` and `Set`, work alike. They also use `Symbol.species`. +```smart header="Le altre collezioni funzionano in maniera simile" +Le altre collezioni, come `Map` e `Set`, funzionano in maniera molto simile. Anche queste utilizzano `Symbol.species`. ``` -## No static inheritance in built-ins +## Con gli oggetti built-in non si ereditano le proprietà statiche -Built-in objects have their own static methods, for instance `Object.keys`, `Array.isArray` etc. +Gli oggetti built-in possiedono i loro metodi statici, ad esempio `Object.keys`, `Array.isArray` etc. -As we already know, native classes extend each other. For instance, `Array` extends `Object`. +Come già sappiamo, le classi integrate si estendono a vicenda. Ad esempio, `Array` estende `Object`. -Normally, when one class extends another, both static and non-static methods are inherited. That was thoroughly explained in the article [](info:static-properties-methods#statics-and-inheritance). +Normalmente, quando una classe ne estende un'altra, sia i metodi statici che quelli non-statici vengono ereditati. Questo è stato ampiamente spiegato nell'articolo [](info:static-properties-methods#statics-and-inheritance). -But built-in classes are an exception. They don't inherit statics from each other. +Ma le classi built-in fanno eccezione. Queste infatti, non ereditano i membri statici a vicenda. -For example, both `Array` and `Date` inherit from `Object`, so their instances have methods from `Object.prototype`. But `Array.[[Prototype]]` does not reference `Object`, so there's no, for instance, `Array.keys()` (or `Date.keys()`) static method. +Ad esempio, sia `Array` che `Date` ereditano da `Object`, quindi le loro istanze possiedono i metodi di `Object.prototype`. Ma `Array.[[Prototype]]` non fa riferimento ad `Object`, quindi, ad esempio, non si ha alcun metodo statico come `Array.keys()` (o `Date.keys()`). -Here's the picture structure for `Date` and `Object`: +Qui vediamo raffigurata la struttura per `Date` e `Object`: ![](object-date-inheritance.svg) -That's an important difference of inheritance between built-in objects compared to what we get with `extends`. +Questa è un'importante differenza dell'ereditarietà tra gli oggetti integrati, rispetto a quella che otteniamo tramite `extends`. From 33f81dac000afd8588d2b3849bb3b8fc5ae50865 Mon Sep 17 00:00:00 2001 From: Andrea <45577511+longo-andrea@users.noreply.github.com> Date: Fri, 5 Mar 2021 13:48:59 +0100 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Dorin-David <70648503+Dorin-David@users.noreply.github.com> --- 1-js/09-classes/05-extend-natives/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/09-classes/05-extend-natives/article.md b/1-js/09-classes/05-extend-natives/article.md index 5f2abbd61..35490536e 100644 --- a/1-js/09-classes/05-extend-natives/article.md +++ b/1-js/09-classes/05-extend-natives/article.md @@ -21,7 +21,7 @@ alert(filteredArr); // 10, 50 alert(filteredArr.isEmpty()); // false ``` -Notiamo una cosa interessante. I metodi built-in come like `filter`, `map` e cosi via -- ritornano nuovi esattamente del nuovo tipo ereditato, cioè `PowerArray`. La loro implementazione interna utilizzata il `costruttore` per farlo. +Notiamo una cosa interessante. I metodi built-in come `filter`, `map` e così via -- ritornano nuovi oggetti del tipo ereditato, cioè `PowerArray`. La loro implementazione interna utilizzata il `costruttore` per farlo. Nell'esempio sopra, ```js @@ -32,7 +32,7 @@ Quando invochiamo `arr.filter()`, questo creerà internamente il nuovo array con Ancora meglio, possiamo personalizzarne il comportamento. -Possiamo aggiungre uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore utilizzerà internamente per creare le nuove entità in `map`, `filter` e gli altri metodi. +Possiamo aggiungere uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore che Javascript utilizzerà internamente per creare le nuove entità in `map`, `filter` e gli altri metodi. Se invece, la nostra intenzione è quella di restituire degli array standard tramite l'utilizzo dei metodi come `map` o `filter`, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: @@ -76,7 +76,7 @@ Come già sappiamo, le classi integrate si estendono a vicenda. Ad esempio, `Arr Normalmente, quando una classe ne estende un'altra, sia i metodi statici che quelli non-statici vengono ereditati. Questo è stato ampiamente spiegato nell'articolo [](info:static-properties-methods#statics-and-inheritance). -Ma le classi built-in fanno eccezione. Queste infatti, non ereditano i membri statici a vicenda. +Ma le classi built-in fanno eccezione. Queste, infatti, non ereditano i membri statici a vicenda. Ad esempio, sia `Array` che `Date` ereditano da `Object`, quindi le loro istanze possiedono i metodi di `Object.prototype`. Ma `Array.[[Prototype]]` non fa riferimento ad `Object`, quindi, ad esempio, non si ha alcun metodo statico come `Array.keys()` (o `Date.keys()`). From a7c55bbd6f75002d911ae9ae85c109b1c584046a Mon Sep 17 00:00:00 2001 From: Andrea <45577511+longo-andrea@users.noreply.github.com> Date: Fri, 5 Mar 2021 13:49:24 +0100 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Dorin-David <70648503+Dorin-David@users.noreply.github.com> --- 1-js/09-classes/05-extend-natives/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/05-extend-natives/article.md b/1-js/09-classes/05-extend-natives/article.md index 35490536e..b4beda77a 100644 --- a/1-js/09-classes/05-extend-natives/article.md +++ b/1-js/09-classes/05-extend-natives/article.md @@ -34,7 +34,7 @@ Ancora meglio, possiamo personalizzarne il comportamento. Possiamo aggiungere uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore che Javascript utilizzerà internamente per creare le nuove entità in `map`, `filter` e gli altri metodi. -Se invece, la nostra intenzione è quella di restituire degli array standard tramite l'utilizzo dei metodi come `map` o `filter`, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: +Se, invece, la nostra intenzione è quella di restituire degli array standard tramite l'utilizzo dei metodi come `map` o `filter`, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: ```js run class PowerArray extends Array { From 5fc16b72c851ba654a097fa71e8b4ed80035bc59 Mon Sep 17 00:00:00 2001 From: Andrea <45577511+longo-andrea@users.noreply.github.com> Date: Sun, 7 Mar 2021 15:54:04 +0100 Subject: [PATCH 4/4] Apply suggestions from code review Co-authored-by: Simone Pasini <66781510+pasor1@users.noreply.github.com> --- 1-js/09-classes/05-extend-natives/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/09-classes/05-extend-natives/article.md b/1-js/09-classes/05-extend-natives/article.md index b4beda77a..e123e7ef1 100644 --- a/1-js/09-classes/05-extend-natives/article.md +++ b/1-js/09-classes/05-extend-natives/article.md @@ -21,20 +21,20 @@ alert(filteredArr); // 10, 50 alert(filteredArr.isEmpty()); // false ``` -Notiamo una cosa interessante. I metodi built-in come `filter`, `map` e così via -- ritornano nuovi oggetti del tipo ereditato, cioè `PowerArray`. La loro implementazione interna utilizzata il `costruttore` per farlo. +Notiamo una cosa interessante. I metodi built-in come `filter`, `map` e così via, ritornano nuovi oggetti del tipo ereditato, cioè `PowerArray`. La loro implementazione interna utilizzata la proprietà oggetto `constructor` per farlo. Nell'esempio sopra, ```js arr.constructor === PowerArray ``` -Quando invochiamo `arr.filter()`, questo creerà internamente il nuovo array contenente i risultati utilizzando `arr.constructor`, non l'`Array` standard. Questo è molto utile, poiché possiamo continuare ad utilizzare i metodi di `PowerArray` anche dopo aver ottenuto il risultato. +Quando invochiamo `arr.filter()`, questo creerà internamente il nuovo array contenente i risultati utilizzando `arr.constructor`, non l'oggetto `Array` standard. Questo è molto utile, poiché successivamente possiamo utilizzare i metodi di `PowerArray` sul risultato ottenuto. -Ancora meglio, possiamo personalizzarne il comportamento. +Inoltre, possiamo personalizzarne il comportamento. -Possiamo aggiungere uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore che Javascript utilizzerà internamente per creare le nuove entità in `map`, `filter` e gli altri metodi. +Possiamo aggiungere uno speciale getter statico `Symbol.species` alla classe. Questo dovrebbe ritornare il costruttore che Javascript utilizzerà internamente per creare le nuove entità in `map`, `filter` e così via. -Se, invece, la nostra intenzione è quella di restituire degli array standard tramite l'utilizzo dei metodi come `map` o `filter`, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: +Se, ad esempio, volessimo che metodi come `map` o `filter` restituiscano un array standard, possiamo ritornare `Array` in `Symbol.species`, come nell'esempio: ```js run class PowerArray extends Array { @@ -76,7 +76,7 @@ Come già sappiamo, le classi integrate si estendono a vicenda. Ad esempio, `Arr Normalmente, quando una classe ne estende un'altra, sia i metodi statici che quelli non-statici vengono ereditati. Questo è stato ampiamente spiegato nell'articolo [](info:static-properties-methods#statics-and-inheritance). -Ma le classi built-in fanno eccezione. Queste, infatti, non ereditano i membri statici a vicenda. +Ma le classi built-in fanno eccezione. Queste, infatti, non ereditano i membri statici a le une dalle altre. Ad esempio, sia `Array` che `Date` ereditano da `Object`, quindi le loro istanze possiedono i metodi di `Object.prototype`. Ma `Array.[[Prototype]]` non fa riferimento ad `Object`, quindi, ad esempio, non si ha alcun metodo statico come `Array.keys()` (o `Date.keys()`).