forked from mouredev/hello-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path23-classes-exercises.js
More file actions
166 lines (143 loc) · 4.08 KB
/
23-classes-exercises.js
File metadata and controls
166 lines (143 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
Clase 39 - Ejercicios: Clases
Vídeo: https://youtu.be/1glVfFxj8a4?t=18630
*/
// 1. Crea una clase que reciba dos propiedades
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
//Metodo static calcula el area de un rectángulo
static calculateArea(width, height) {
return width * height;
}
}
//Ejemplo de uso
const rect = new Rectangle(10, 5);
console.log(`Ancho: ${rect.width}, Alto: ${rect.height}`);
// 2. Añade un método a la clase que utilice las propiedades
Rectangle.prototype.area = function () {
return this.width * this.height;
};
// Ejemplo de uso
console.log(`Área del rectángulo: ${rect.area()}`);
// Muestra la clase por consola y sus propiedades
console.log(Rectangle);
console.log(`Clase Rectangle: ${JSON.stringify(rect)}`);
// Muestra los metodos de la clase
console.log(
`Métodos de Rectangle: ${Object.getOwnPropertyNames(Rectangle.prototype)}`
);
// 3. Muestra los valores de las propiedades e invoca a la función
console.log(`Ancho: ${rect.width}, Alto: ${rect.height}`);
console.log(`Área: ${rect.area()}`);
// 4. Añade un método estático a la primera clase
class Circle {
constructor(radius) {
this.radius = radius;
}
static calculateCircumference(radius) {
return 2 * Math.PI * radius;
}
}
// 5. Haz uso del método estático
const circle = new Circle(12);
console.log(
`Circunferencia del círculo con radio ${
circle.radius
}: ${Circle.calculateCircumference(circle.radius)}`
);
//Hace uso del metodo estatico de la clase Rectangle
console.log(
`Área del rectángulo con ancho ${rect.width} y alto ${
rect.height
}: ${Rectangle.calculateArea(rect.width, rect.height)}`
);
// 6. Crea una clase que haga uso de herencia por ejemplo Animal y Dog
class Animal {
constructor(name) {
this.name = name;
}
speak() {
// Método que puede ser sobrescrito por las clases hijas
console.log(`${this.name} hace un sonido.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Llama al constructor de la clase padre
this.breed = breed;
}
speak() {
console.log(`${this.name} ladra.`);
}
}
// Ejemplo de uso
const myDog = new Dog("Rex", "Labrador");
myDog.speak(); // Rex ladra.
// 7. Crea una clase que haga uso de getters y setters a partir de la clase anterior de Animal
class AnimalWithAge {
constructor(name, age) {
this.name = name;
this._age = age; // Propiedad privada
}
get age() {
return this._age;
}
set age(newAge) {
if (newAge < 0) {
console.log("La edad no puede ser negativa.");
} else {
this._age = newAge;
}
}
}
// Ejemplo de uso
const myAnimal = new AnimalWithAge("Leo", 5);
console.log(`Nombre: ${myAnimal.name}, Edad: ${myAnimal.age}`);
myAnimal.age = 6; // Usando el setter
console.log(`Nueva edad: ${myAnimal.age}`);
// myAnimal.age = -1; // Intento de establecer una edad negativa
// console.log(`Nueva edad: ${myAnimal.age}`); // No se actualizará, ya que la edad no puede ser negativa
// 8. Modifica la clase con getters y setters para que use propiedades privadas
class PrivateAnimal {
#name;
#age;
constructor(name, age) {
this.#name = name;
this.#age = age;
}
get name() {
return this.#name;
}
get age() {
return this.#age;
}
set age(newAge) {
if (newAge < 0) {
console.log("La edad no puede ser negativa.");
} else {
this.#age = newAge;
}
}
}
// 9. Utiliza los get y set y muestra sus valores
const myPrivateAnimal = new PrivateAnimal("Milo", 3);
console.log(`Nombre: ${myPrivateAnimal.name}, Edad: ${myPrivateAnimal.age}`);
myPrivateAnimal.age = 4; // Usando el setter
console.log(`Nueva edad: ${myPrivateAnimal.age}`);
//myPrivateAnimal.name = "Max"; // Esto no funcionará, ya que name es una propiedad privada
// 10. Sobrescribe un método de una clase que utilice herencia
class Cat extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} maulla.`);
}
}
// Ejemplo de uso
const myCat = new Cat("Whiskers", "Siamese");
myCat.speak(); // Whiskers maulla.