¡Te damos la bienvenida a este reto!

1

¡Bienvenido al mundo de JavaScript!

Día 1

2

Variables, funciones y sintaxis básica

3

Tipos de datos

4

Playground - Retorna el tipo

5

Tipos de datos - pt 2

Día 2

6

Operadores

7

Hoisting y coerción

8

Playground - Calcula la propina

9

Alcance de las variables

Día 3

10

Condicionales

11

Playground - Calcula años bisiestos

12

Switch

13

Playground - Obten información de mascotas según su tipo

14

Ciclos

15

Playground - Dibuja un triangulo

Día 4

16

Arrays

17

Playground - Encuentra al michi mas famoso

18

Objetos

19

Playground - Obten el promedio de los estudiantes

Día 5 - Checkpoint

20

Playground - encuentra el palindromo más grande

Día 6

21

Reasignación y redeclaración

22

Modo estricto

Día 7

23

Debugging y manejo de errores

24

Programación funcional

Quiz: Día 7

Día 8

25

Closures

26

Playground - Crea una calculadora con closures

27

Higher order functions

28

Playground - Crea tu propio método map

Día 9

29

ECMAScript

30

TC39

Quiz: Día 9

Día 10 - Checkpoint

31

ES6

32

ES7

33

Playground - Task planner

Día 11

34

Asincronismo

35

Playground - Promesas

36

Manejando el asincronismo

37

Playground - Resuelve el callback hell usando promesas

38

Playground - Resuelve el callback hell usando async/await

Día 12

39

Arrays a profundidad

40

Métodos de arrays: Every, Find y findIndex

41

Playground - Válida el formulario

Día 13

42

Métodos de arrays: Includes, Join y concat

43

Playground - agrupa los productos

44

Métodos de arrays: Flat y FlatMap

45

Playground - Encuentra la ubicación del valor buscado

Día 14

46

Mutable functions

47

Playground - Modifica una lista de compras

48

Métodos de arrays: sort

49

Playground - Ordena los productos

Día 15 - Checkpoint

50

Playground - Sistema de reservaciones de un hotel

Día 16

51

Programación orientada a objetos en JavaScript

52

Objetos literales

53

Playground - Congela el objeto recursivamente

Día 17

54

Prototipos en JavaScript

55

Playground - Modifica el prototype de los arrays

56

Playground - Crea un auto usando clases

Día 18

57

Abstracción en JavaScript

58

Playground - Sistema de carrito de compras

59

Encapsulamiento en JavaScript

60

Playground - Encapsula datos de los usuarios

Día 19

61

Herencia en JavaScript

62

Playground - Jerarquía de animales

63

Polimorfismo en JavaScript

64

Playground - Sistema de pagos

Día 20 - Checkpoint

65

Playground - Agenda de vuelos

Día 21

66

Patrones de diseño

67

Sinlgeton y Factory pattern en JavaScript

68

Playground - Implementa singleton en un chat

Día 22

69

Adapter y Decorator pattern en JavaScript

70

Playground - Personaliza productos de una tienda

71

Builder y Protype pattern en JavaScript

72

Playground - Mejora el código usando builder pattern

Día 23

73

Facade y proxy pattern en JavaScript

74

Playground - Proxy en servicio de mensajería

75

Chain of responsability y Observer pattern en JavaScript

76

Playground - Implementación de Observador en Newsletter

Día 24 - Checkpoint

77

Playground - Crea un task manager con patrones de diseño

Día 25

78

Estructuras de datos en JavaScript

79

Playground - Crea tu propia implementación de un array

80

Hash tables en JavaScript

81

Playground - Implementación de una HashTable para Contactos

Día 26

82

Set en JavaScript

83

Playground - Remueve duplicados de una lista

84

Maps en JavaScript

85

Playground - Crea un organizador de tareas

Día 27

86

Singly Linked List en JavaScript

87

Playground - Agrega métodos a la singly linked list

88

Playground - Implementación de una singly linked list

Día 28

89

Stacks en JavaScript

90

Playground - Crea un stack para una playlist

Día 29

91

Queues en JavaScript

92

Playground - Crea una cola de emails

Día 30

93

¡Lo lograste!

Live Class

94

30 días de JS con Juan DC

95

30 días de JS con Nicobytes

96

30 días de JS con GNDX

97

30 días de JS con LeoCode

98

30 días de JS con Teffcode

99

Sesión: Cierre de los 30 días de JavaScript

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
15 Hrs
23 Min
19 Seg

Playground - Personaliza productos de una tienda

70/99

Aportes 32

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Muy entendible, listo.

excercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con garantía';
  }
}

ShippingInsurance.js


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con seguro de envío';
  }
}

Dejo por mi aporte un aporte. Creo que es mejor declarar siempre las constantes en este caso utilice un objeto para guardar los precios y cadenas del decorador, en todo lo demás se ve igual al resto de soluciones. XD

class ShippingInsuranceDecorator extends Product {

  SHIPPING_INSURANCE = {
    price: 20,
    description: " con seguro de envío",
  }

  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + this.SHIPPING_INSURANCE.price;
  }

  getDescription() {
    return this.product.getDescription() + this.SHIPPING_INSURANCE.description;
  }
}
class WarrantyDecorator extends Product {

  WARRANTY = {
    price: 20,
    description: " con garantía",
  }

  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + this.WARRANTY.price;
  }

  getDescription() {
    return this.product.getDescription() + this.WARRANTY.description;
  }
}

🛡️Escudo anti-spoilers🛡️

aquí mi código

ShippingInsurance.js


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío";
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con garantía";
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description
  }
}
Para aquellos que practicaron bien la clase anterior, debieron encontrar este ejercicio muy fácil :). Por cierto, muchas gracias por documentar bien el ejercicio, se pudo entender a la primera. ![](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOGp6Y2N2dDk2dzJpdjM2Y21rbW1sejRiYmNzMjYxOWNyNXAyenl2ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ZJPSFNLmADueHvzoZ8/giphy.gif) ![](https://static.platzi.com/media/user_upload/code-6300653f-8bad-4d69-9469-ed2dff5ff527.jpg)

Mi solucion:
.
.
.
.
.
.
.
.
.
.
exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con garantía";
  }
} 

ShippingInsurance

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío";
  }
}

Mi solución 💚
Nada más una nota, tanto en ShippingInsurance como en WarrantyDecorator se nos pide heredar de Product. Sin embargo, por las descripciones solicitadas (y como se observa en el ejemplo) siento que es más prudente si se hereda directamente de BasicProduct. De esa manera se evitan errores por no tener productos sin descripción y se reduce mucho el código.

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price)
    this.description = description
  }

  getDescription() {
    return this.description
  }
}

ShippingInsurance.js

import { BasicProduct } from "./exercise";

export class ShippingInsuranceDecorator extends BasicProduct {
  constructor(product) {
    super(product.price + 20, `${product.description} con seguro de envío`)
  }
}

WarrantyDecorator.js

import { BasicProduct } from "./exercise";

export class WarrantyDecorator extends BasicProduct {
  constructor(product) {
    super(product.price + 20, `${product.description} con garantía`)
  }
}

🛡️🛡️🛡️Escudo anti spoilers🛡️🛡️🛡️

Personaliza productos de una tienda

exercise.js

export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

Warranty decorator

export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
    this.product.price += 20;
    this.product.description += " con garantia";
  }

  getPrice() {
    // Tu código aquí 👈
  }

  getDescription() {
    // Tu código aquí 👈
    return this.product.description;
  }
}

Shipping Insurance

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con seguro de envío';
  }
}
// ShippingInsurance.js
export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con seguro de envío`;
  }
}

// WarrantyDecorator.js
export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con garantía`;
  }
}
// exercise.js
export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

ShippingInsurance.js

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super(product.getPrice() + 20, product.getDescription() + " con seguro de envío");
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío";
  }
}

WarrantyDecorator

export class WarrantyDecorator extends Product {
  constructor(product) {
    super(product.getPrice() + 20, product.getDescription() + " con garantía");
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con garantía";
  }
}

exercise.js

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

Hola mi solución.











ShippingInsurance.js

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super(product);
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con seguro de envío`;
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super(product);
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con garantía`;
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

product.js

export class Product {
  // Este código no debe ser editado ❌
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}

Solución

class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.price = product.price + 20;
    this.description = ` ${product.description} with warranty`;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.price = product.price + 20;
    this.description = ` ${product.description} with shipping insurance`;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

SPOILER!!!
.
.

.
.
.
.


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.price + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con seguro de envío`
  }
}
import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.price + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con garantía`
  }
}
import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price)
    this.description =  description
  }

  getDescription() {
    return this.description
  }
}


.
.
.
.
.
.

exercise.js:

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

WarrantyDecorator.js:

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.price + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con garantía`
  }
} 

ShippingInsurance.js:

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.price + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con seguro de envío`
  }
}

MI SOLUCION 💪
.
.
.
.
.
.
.
.
.
.
.
.
.
class BasicProduct

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

class WarrantyDecorator

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super(product.price);
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con garantía`;
  
  }
}

class ShippingInsuranceDecorator


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super(product.price);
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return `${this.product.getDescription()} con seguro de envío`;
  }
}

Seguimos, pero por un acento no me pasaba:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

exercise,js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈 
    super();
    this.price = price;
    this.description = description;
  }
  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
  }
  getPrice() {
    // Tu código aquí 👈
    return this.product.getPrice() + 20;
  }
  getDescription() {
    // Tu código aquí 👈
    return this.product.getDescription() + ' con garantía';
  }
}

ShippingInsurance.js

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
  }
  getPrice() {
    // Tu código aquí 👈
    return this.product.getPrice() + 20;
  }
  getDescription() {
    // Tu código aquí 👈
    return this.product.getDescription() + ' con seguro de envío';
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super(price);
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

ShippingInsurance.js

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.product.getPrice() + 20;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.product.getDescription()} con seguro de envío`
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.product.getPrice() + 20;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.product.getDescription()} con garantía`;
  }
}

🛡️🛡️Escudo anti-spoilers🛡️🛡️

Mi solución al reto:

ShippingInsurance.js


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super()
    this.product = product
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con seguro de envío'
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super()
    this.product = product
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con garantía'
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price, description)
    this.description = description
    this.price = price
  }

  getDescription() {
    return this.description
  }
}

Aquí mi solución:
.
.
.
.
.
.
.
.
.
.
.
.
exercise.js

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

WarrantyDecorator .js

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20
  }

  getDescription() {
    return this.product.getDescription() + " con garantía"
  }
}

ShippingInsuranceDecorator.js

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío"
  }
}

Muy bien detallado, creo que es el primero que hago a la primera jeje, aquí dejo mi código… 😃

export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super(price);
    this.description = description;

  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}
export class Product {
  // Este código no debe ser editado ❌
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}
export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.price = product.price + 20;
    this.description = product.description;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.description} con garantía`;
  }
}
export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.price = product.price + 20;
    this.description = product.description;
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.description} con seguro de envío`;
  }
}

Hola, dejo mi solución
.
.
.

.
.
.
.
.

class Product {
  // Este código no debe ser editado ❌
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}

// ShippingInsurance.js
class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
    // Tu código aquí 👈
  }

  getPrice() {
    // Tu código aquí 👈
    return parseFloat(this.product.getPrice()) + 20;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.product.getDescription()} con seguro de envío`;
  }
}

// WarrantyDecorator.js
class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.product = product;
  }

  getPrice() {
    // Tu código aquí 👈
    return parseFloat(this.product.getPrice()) + 20;
  }

  getDescription() {
    // Tu código aquí 👈
    return `${this.product.getDescription()} con garantía`;
  }
}

// exercise.js
class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

ez el tutorial

mi versión de la solución, importante revisar lo del control del precio:

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.price = product.price + 20;
    this.description = product.description;
    this.conSeguro = "con seguro de envío";
    if (product.conGarantia) {
      this.conGarantia = product.conGarantia;
    } else {
      this.conGarantia = "";
    }
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    if (this.conGarantia && this.conSeguro) {
      return `${this.description} ${this.conGarantia} ${this.conSeguro}`;
    } else if (this.conGarantia) {
      return `${this.description} ${this.conGarantia}`;
    } else if (this.conSeguro) {
      return `${this.description} ${this.conSeguro}`;
    } else {
      return `${this.description}`;
    }
  }
}
 export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super();
    this.description = product.description;
    this.price = product.price + 20;
    this.conGarantia = "con garantía";
    if (product.conSeguro) {
      this.conSeguro = product.conSeguro;
    } else {
      this.conSeguro = "";
    }
  }

  getPrice() {
    // Tu código aquí 👈
    return this.price;
  }

  getDescription() {
    // Tu código aquí 👈
    if (this.conGarantia == undefined) {
      return `${this.description}`;
    } else return `${this.description} ${this.conGarantia}`;
  }
}
export class BasicProduct extends Product {
  constructor(price, description) {
    // Tu código aquí 👈
    super(price);
    this.description = description;
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description;
  }
}

Solución… 😄
.

.
ShippingInsurance.js:
.

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío";
  }
}

.
WarrantyDecorator.js:
.

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con garantía";
  }
}

.
exercise.js:
.

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

.
product.js:
.

export class Product {
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}

Es hermoso que en la vista ya venga con información de ejemplo para uno no tener que escribirla 😊

.
:
:
:
:
:
:
::
:
:

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío"
  }
}

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + " con garantía"
  }
}

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super();
    this.price = price;
    this.description = description;
  }

  getDescription() {
    return this.description
  }
}

export class Product {
    // Este código no debe ser editado ❌
    constructor(price) {
      this.price = price;
    }
  
    getPrice() {
      return this.price;
    }
  
    getDescription() {
      throw new Error("Este método debe ser implementado en las subclases");
    }
  }

mmm

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

Les comparto mi solución. 😄

ShippingInsurance.js

import { Product } from './product.js';
export class ShippingInsuranceDecorator extends Product {
  product;
  constructor(product) {
    const price = product.price + 20;
    super(price);
    this.product = product;
  }
  getPrice() {
    return super.getPrice();
  }
  getDescription() {
    const DESCRIPTION_PRODUCT = this.product.getDescription();
    const MESSAGE = `${DESCRIPTION_PRODUCT} con seguro de envío`;
    return MESSAGE;
  }
}

WarrantyDecorator.js

import { Product } from './product.js';
export class WarrantyDecorator extends Product {
  product;
  constructor(product) {
    const price = product.price + 20;
    super(price);
    this.product = product;
  }
  getPrice() {
    return super.getPrice();
  }
  getDescription() {
    const DESCRIPTION_PRODUCT = this.product.getDescription();
    const MESSAGE = `${DESCRIPTION_PRODUCT} con garantía`;
    return MESSAGE;
  }
}

Exercise.js

import { Product } from './product.js';
export class BasicProduct extends Product {
  price;
  description;
  constructor(price, description) {
    super(price);
    this.price = price;
    this.description = description;
    this.description = description;
  }
  getDescription() {
    return this.description;
  }
}

Mi respuesta
.
Exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }
  getPrice() {
    return this.price;
  }
  getDescription() {
    return this.description;
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }
  getPrice() {
    return this.product.getPrice() + 20;
  }
  getDescription() {
    return this.product.getDescription() + ' con garantía';
  }
}

ShippingInsurance.js

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }
  getPrice() {
    return this.product.getPrice()+20;
  }
  getDescription() {
    return this.product.getDescription() + ' con seguro de envío';
  }
}

Mi solución:
.
.
.
.
.
.

product.js

export class Product {
  // Este código no debe ser editado ❌
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price)
    this.description = description
  }

  getDescription() {
    return this.description
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super()
    this.product = product
  }

  getPrice() {
    return this.product.getPrice() + 20
  }

  getDescription() {
    return this.product.getDescription() + " con garantía"
  }
}

ShippingInsurance.js

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super()
    this.product = product
  }

  getPrice() {
    return this.product.getPrice() + 20
  }

  getDescription() {
    return this.product.getDescription() + " con seguro de envío"
  }
}

mi solución:
código de exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price);
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}

código de WarrantyDecorators.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con garantía';
  }
}

código de ShippingInsurance.js


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super();
    this.product = product;
  }

  getPrice() {
    return this.product.getPrice() + 20;
  }

  getDescription() {
    return this.product.getDescription() + ' con seguro de envío';
  }
}

ShippingInsurance.js


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super(product.getPrice() + 20)
    this.description = `${product.getDescription()} con seguro de envío`
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    return this.description
  }
}

WarrantyDecorator.js

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super(product.getPrice() + 20)
    this.description = `${product.getDescription()} con garantía`
  }

  getPrice() {
    return this.price
  }

  getDescription() {
    return this.description;
  }
}

exercise.js

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price)
    this.price = price
    this.description = description
  }

  getDescription() {
    return this.description
  }
}

Product.js

export class Product {
  // Este código no debe ser editado ❌
  constructor(price) {
    this.price = price;
  }

  getPrice() {
    return this.price;
  }

  getDescription() {
    throw new Error("Este método debe ser implementado en las subclases");
  }
}

Mi solución:

exercise.js:

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super()
    this.price = price
    this.description = description
  }

  getDescription() {
    // Tu código aquí 👈
    return this.description
  }
}

WarrantyDecorator.js:

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super()
    this.product = product
  }

  getPrice() {
    // Tu código aquí 👈
   return this.product.price += 20
  }

  getDescription() {
    // Tu código aquí 👈
    return this.product.description += ' con garantía'
  }
}

ShippingInsurance.js:


import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    // Tu código aquí 👈
    super()
    this.product = product
  }

  getPrice() {
    // Tu código aquí 👈
    return this.product.price += 20
  }

  getDescription() {
    // Tu código aquí 👈
    return this.product.description += ' con seguro de envío'
  }
}

Mi solución
*
*
*
*
*
*
*
*
*

ShippingInsuranceDecorator

import { Product } from "./product";

export class ShippingInsuranceDecorator extends Product {
  constructor(product) {
    super(product.price)
    this.description = product.description
  }

  getPrice() {
    return this.price + 20
  }

  getDescription() {
    return `${this.description} con seguro de envío`
  }
}

WarrantyDecorator

import { Product } from "./product";

export class WarrantyDecorator extends Product {
  constructor(product) {
    super(product.price)
    this.description = product.description
  }

  getPrice() {
    return this.price + 20
  }

  getDescription() {
    return `${this.description} con garantía`
  }
}

BasicProduct

import { Product } from "./product";

export class BasicProduct extends Product {
  constructor(price, description) {
    super(price)
    this.description = description;
  }

  getDescription() {
    return this.description;
  }
}
undefined