- Notifications
You must be signed in to change notification settings - Fork230
Static properties and methods#172
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
joaquinelio merged 2 commits intojavascript-tutorial:masterfromcortizg:es.javascript.info.1-09-03Jun 21, 2020
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
2 commits Select commitHold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
118 changes: 58 additions & 60 deletions1-js/09-classes/03-static-properties-methods/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
| @@ -1,9 +1,9 @@ | ||||||||
| #Propiedades y métodos estáticos. | ||||||||
| También podemos asignar métodos ala funcionalidad de una clase en sí, no a su `"prototype"`.Dichos métodos se llaman *static*. | ||||||||
| En una clase, están precedidos por la palabra clave`static`, como esta: | ||||||||
| ```js run | ||||||||
| class User { | ||||||||
| @@ -14,10 +14,10 @@ class User { | ||||||||
| } | ||||||||
| } | ||||||||
| User.staticMethod(); //verdadero | ||||||||
| ``` | ||||||||
| Eso realmente hace lo mismo que asignarlo como una propiedad directamente: | ||||||||
| ```js run | ||||||||
| class User { } | ||||||||
| @@ -26,14 +26,14 @@ User.staticMethod = function() { | ||||||||
| alert(this === User); | ||||||||
| }; | ||||||||
| User.staticMethod(); //verdadero | ||||||||
| ``` | ||||||||
| El valor de `this`en la llamada`User.staticMethod()`es el mismoconstructorde clase`User`(la regla "objeto antes de punto"). | ||||||||
| Por lo general, los métodos estáticos se utilizan para implementar funciones que pertenecen a la clase, pero no a ningún objetoparticularde la misma. | ||||||||
| Por ejemplo, tenemos objetos `Article`y necesitamos una función para compararlos. Una soluciónnaturalsería agregar el método`Article.compare`, como este: | ||||||||
| ```js run | ||||||||
| class Article { | ||||||||
| @@ -49,7 +49,7 @@ class Article { | ||||||||
| */!* | ||||||||
| } | ||||||||
| //uso | ||||||||
| let articles = [ | ||||||||
| new Article("HTML", new Date(2019, 1, 1)), | ||||||||
| new Article("CSS", new Date(2019, 0, 1)), | ||||||||
| @@ -63,17 +63,17 @@ articles.sort(Article.compare); | ||||||||
| alert( articles[0].title ); // CSS | ||||||||
| ``` | ||||||||
| Aquí `Article.compare`se encuentra "encima" de los artículos, como un medio para compararlos. No es el método de un artículo, sino de toda la clase. | ||||||||
| Otro ejemplo sería un método llamado "factory". Imagina, necesitamos pocas formas para crear un artículo: | ||||||||
| 1.Crearlo por parámetros dados (`title`,`date` etc.). | ||||||||
| 2.Crear un artículo vacío con la fecha de hoy. | ||||||||
| 3. ... o cualquier otra manera. | ||||||||
| La primera forma puede ser implementada por el constructor.Y para el segundo podemos hacer un método estático de la clase. | ||||||||
| Al igual que`Article.createTodays()`aquí: | ||||||||
| ```js run | ||||||||
| class Article { | ||||||||
| @@ -84,32 +84,31 @@ class Article { | ||||||||
| *!* | ||||||||
| static createTodays() { | ||||||||
| //recuerda, this = Article | ||||||||
| return new this("Resumen de hoy", new Date()); | ||||||||
| } | ||||||||
| */!* | ||||||||
| } | ||||||||
| let article = Article.createTodays(); | ||||||||
| alert( article.title ); //Resumen de hoy | ||||||||
| ``` | ||||||||
| Ahora, cada vez que necesitamos crear un resumen de hoy, podemos llamar a `Article.createTodays()`. Una vez más, ese no es el método de un objeto artículo, sino el método de toda la clase. | ||||||||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||
| Los métodos estáticos también se utilizan en clases relacionadas con base de datos para buscar/guardar/eliminar entradas de la misma, como esta: | ||||||||
| ```js | ||||||||
| //suponiendo que el artículo es una clase especial para gestionar artículos | ||||||||
| //método estático para eliminar el artículo: | ||||||||
| Article.remove({id: 12345}); | ||||||||
| ``` | ||||||||
| ##Propiedades estáticas | ||||||||
| [recent browser=Chrome] | ||||||||
| Las propiedades estáticas también son posibles, se ven como propiedades de clase regular, pero precedidas por `static`: | ||||||||
| ```js run | ||||||||
| class Article { | ||||||||
| @@ -119,30 +118,29 @@ class Article { | ||||||||
| alert( Article.publisher ); // Ilya Kantor | ||||||||
| ``` | ||||||||
| Eso es lo mismo que una asignación directa a `Article`: | ||||||||
| ```js | ||||||||
| Article.publisher = "Ilya Kantor"; | ||||||||
| ``` | ||||||||
| ##Herencia de propiedades y métodos estáticos. | ||||||||
| Las propiedades y métodos estáticos son heredados. | ||||||||
| Por ejemplo, `Animal.compare`y `Animal.planet`en el siguiente código son heredados y accesibles como `Rabbit.compare`y `Rabbit.planet`: | ||||||||
| ```js run | ||||||||
| class Animal { | ||||||||
| static planet = "Tierra"; | ||||||||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||
| constructor(name, speed) { | ||||||||
| this.speed = speed; | ||||||||
| this.name = name; | ||||||||
| } | ||||||||
| run(speed = 0) { | ||||||||
| this.speed += speed; | ||||||||
| alert(`${this.name}corre a una velocidad de ${this.speed}.`); | ||||||||
| } | ||||||||
| *!* | ||||||||
| @@ -153,64 +151,64 @@ class Animal { | ||||||||
| } | ||||||||
| //Hereda de Animal | ||||||||
| class Rabbit extends Animal { | ||||||||
| hide() { | ||||||||
| alert(`${this.name}se esconde!`); | ||||||||
| } | ||||||||
| } | ||||||||
| let rabbits = [ | ||||||||
| new Rabbit("Conejo Blanco", 10), | ||||||||
| new Rabbit("Conejo Negro", 5) | ||||||||
| ]; | ||||||||
| *!* | ||||||||
| rabbits.sort(Rabbit.compare); | ||||||||
| */!* | ||||||||
| rabbits[0].run(); //Conejo Negro corre a una velocidad de 5. | ||||||||
| alert(Rabbit.planet); //Tierra | ||||||||
| ``` | ||||||||
| Ahora, cuando llamemos a `Rabbit.compare`,se llamará a`Animal.compare`heredado. | ||||||||
| ¿Como funciona? Nuevamente, usando prototipos. Como ya habrás adivinado, `extends`da a`Rabbit`el `[[Prototype]]`referente a `Animal`. | ||||||||
|  | ||||||||
| Entonces, `Rabbit extends Animal`crea dos referencias`[[Prototype]]`: | ||||||||
| 1.La función de`Rabbit`se hereda prototípicamente de la función de`Animal`. | ||||||||
| 2. `Rabbit.prototype`prototípicamente hereda de `Animal.prototype`. | ||||||||
| Como resultado, la herencia funciona tanto para métodos regulares como estáticos. | ||||||||
| Verifiquemos eso por código, aquí: | ||||||||
| ```js run | ||||||||
| class Animal {} | ||||||||
| class Rabbit extends Animal {} | ||||||||
| //para la estática | ||||||||
| alert(Rabbit.__proto__ === Animal); //verdadero | ||||||||
| //para métodos regulares | ||||||||
| alert(Rabbit.prototype.__proto__ === Animal.prototype); //verdadero | ||||||||
| ``` | ||||||||
| ##Resumen | ||||||||
| Los métodos estáticos se utilizan en la funcionalidad propia de la clase "en su conjunto".No se relaciona con una instancia de clase concreta. | ||||||||
| Por ejemplo, un método para comparar `Article.compare(article1, article2)`o un método de fábrica `Article.createTodays()`. | ||||||||
| Están etiquetados por la palabra`static`en la declaración de clase. | ||||||||
| Las propiedades estáticas se utilizan cuando queremos almacenar datos a nivel de clase, también no vinculados a una instancia. | ||||||||
| La sintaxis es: | ||||||||
| ```js | ||||||||
| class MyClass { | ||||||||
| @@ -222,13 +220,13 @@ class MyClass { | ||||||||
| } | ||||||||
| ``` | ||||||||
| Técnicamente, la declaración estática es lo mismo que asignar a la clase misma: | ||||||||
| ```js | ||||||||
| MyClass.property = ... | ||||||||
| MyClass.method = ... | ||||||||
| ``` | ||||||||
| Las propiedades y métodos estáticos se heredan. | ||||||||
| Para `class B extends A`el prototipo de la clase `B`en sí mismo apunta a`A`: `B.[[Prototipo]] = A`.Entonces, si no se encuentra un campo en `B`,la búsqueda continúa en `A`. | ||||||||
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.