- Notifications
You must be signed in to change notification settings - Fork230
F.prototype#192
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
Uh oh!
There was an error while loading.Please reload this page.
F.prototype#192
Changes fromall commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,20 @@ | ||
Respuestas: | ||
1. `verdadero`. | ||
La asignación a `Rabbit.prototype`configura`[[Prototype]]`para objetos nuevos, pero no afecta a los existentes. | ||
2. `falso`. | ||
Los objetos se asignan por referencia. El objeto de `Rabbit.prototype`no está duplicado, sigue siendo un solo objeto referenciado tanto por `Rabbit.prototype`como por el `[[Prototype]]`de `rabbit`. | ||
Entonces, cuando cambiamos su contenido a través de una referencia, esvisiblea través de la otra. | ||
3. `verdadero`. | ||
Todas las operaciones`delete`se aplican directamente al objeto. Aquí `delete rabbit.eats`intenta eliminar la propiedad`eats`de`rabbit`,pero no la tiene. Entonces la operación no tendrá ningún efecto. | ||
4. `undefined`. | ||
La propiedad `eats`se elimina del prototipo, ya no existe. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,18 @@ | ||
# F.prototype | ||
Recuerde, se pueden crear nuevos objetos con una función constructora, como `new F()`. | ||
Si `F.prototype`es un objeto, entonces el operador`new`lo usa para establecer`[[Prototype]]`para el nuevo objeto. | ||
```smart | ||
JavaScripttenía herencia prototípica desde el principio. Era una de las características principales del lenguaje. | ||
Pero en los viejos tiempos,nohabía acceso directo a él. Lo único que funcionó de manera confiable fue una propiedad`"prototype"`de la función constructora, descrita en este capítulo. Así que hay muchos scriptsque todavía lo usan. | ||
``` | ||
Tenga en cuenta que`F.prototype`aquí significa una propiedadregularllamada`"prototype"`en `F`.Suena algosimilaral término"prototype",pero aquí realmente queremos decir una propiedadregularcon este nombre. | ||
Aquí está el ejemplo: | ||
```js run | ||
let animal = { | ||
@@ -27,95 +27,95 @@ function Rabbit(name) { | ||
Rabbit.prototype = animal; | ||
*/!* | ||
let rabbit = new Rabbit("Conejo Blanco"); // rabbit.__proto__ == animal | ||
alert( rabbit.eats ); //verdadero | ||
``` | ||
La configuración de`Rabbit.prototype = animal`literalmente establece lo siguiente: "Cuando se crea un`new Rabbit`, asigne su `[[Prototype]]`a `animal`". | ||
Esta es la imagen resultante: | ||
 | ||
En la imagen, `"prototype"`es una flecha horizontal, que significa una propiedad regular, y `[[Prototype]]`es vertical,que significa la herencia de`rabbit`desde `animal`. | ||
```smart header="`F.prototype`solo se usa en el momento`new F`" | ||
La propiedad`F.prototype`solo se usa cuando se llama a`new F`, asigna`[[Prototype]]`del nuevo objeto. | ||
Si, después de la creación, la propiedad`F.prototype`cambia(`F.prototype = <otro objeto>`),los nuevos objetos creados por `new F`tendrán otro objeto como`[[Prototype]]`,pero ya los objetos existentes conservan el antiguo. | ||
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. Si, después de la creación, la propiedad | ||
``` | ||
## F.prototype predeterminado, propiedad del constructor | ||
Cada función tiene la propiedad`"prototype"`incluso si no la suministramos. | ||
El`"prototype"`predeterminado es un objeto con la única propiedad`constructor`que apunta de nuevo a la función misma. | ||
Como esto: | ||
```js | ||
function Rabbit() {} | ||
/*prototipo predeterminado | ||
Rabbit.prototype = { constructor: Rabbit }; | ||
*/ | ||
``` | ||
 | ||
Lo podemos comprobar: | ||
```js run | ||
function Rabbit() {} | ||
//por defecto: | ||
// Rabbit.prototype = { constructor: Rabbit } | ||
alert( Rabbit.prototype.constructor == Rabbit ); //verdadero | ||
``` | ||
Naturalmente, si no hacemos nada, la propiedad`constructor`está disponible para todos los rabbitsa través de `[[Prototype]]`: | ||
```js run | ||
function Rabbit() {} | ||
//por defecto: | ||
// Rabbit.prototype = { constructor: Rabbit } | ||
let rabbit = new Rabbit(); //hereda de {constructor: Rabbit} | ||
alert(rabbit.constructor == Rabbit); //verdadero (desde prototype) | ||
``` | ||
 | ||
Podemos usar la propiedad`constructor`para crear un nuevo objeto usando elconstructorya existente. | ||
Como aqui: | ||
```js run | ||
function Rabbit(name) { | ||
this.name = name; | ||
alert(name); | ||
} | ||
let rabbit = new Rabbit("Conejo Blanco"); | ||
*!* | ||
let rabbit2 = new rabbit.constructor("Conejo Negro"); | ||
*/!* | ||
``` | ||
Eso es útil cuando tenemos un objeto, no sabemos qué constructorse usó para él (por ejemplo, proviene de una biblioteca de terceros),y necesitamos crear otro del mismo tipo. | ||
Pero probablemente lo más importante sobre`"constructor"`es que... | ||
**...JavaScripten sí mismo no garantiza el valor correcto de`"constructor"`.** | ||
Sí, existe en el `"prototipo"`predeterminado para las funciones, pero eso es todo. Lo que sucede con eso más tarde, depende totalmente de nosotros. | ||
En particular,si reemplazamos el prototipo predeterminado como un todo, entoncesnohabrá`"constructor"`en él. | ||
Por ejemplo: | ||
```js run | ||
function Rabbit() {} | ||
@@ -125,22 +125,22 @@ Rabbit.prototype = { | ||
let rabbit = new Rabbit(); | ||
*!* | ||
alert(rabbit.constructor === Rabbit); //falso | ||
*/!* | ||
``` | ||
Entonces, para mantener el`"constructor"`correcto, podemos elegir agregar/eliminar propiedades al `"prototipo"`predeterminado en lugar de sobrescribirlo como un todo: | ||
```js | ||
function Rabbit() {} | ||
//No sobrescribir totalmenteRabbit.prototype | ||
//solo agrégale | ||
Rabbit.prototype.jumps = true | ||
//se conserva elRabbit.prototype.constructorpredeterminado | ||
``` | ||
O, alternativamente, vuelva a crear la propiedad`constructor`manualmente: | ||
```js | ||
Rabbit.prototype = { | ||
@@ -150,26 +150,26 @@ Rabbit.prototype = { | ||
*/!* | ||
}; | ||
//ahora elconstructortambién es correcto, porque lo agregamos | ||
``` | ||
##Resumen | ||
En este capítulo describimos brevemente la forma de establecer un`[[Prototype]]`para los objetos creados através de una función de constructor. Más adelante veremos patrones de programación más avanzados que dependen de él. | ||
Todo es bastante simple,solo algunas notas para aclarar las cosas: | ||
-La propiedad`F.prototype`(no la confunda con `[[Prototype]]`)establece `[[Prototype]]`de objetos nuevos cuando se llama a`new F()`. | ||
-El valor de `F.prototype`debe ser un objeto o`null`:otros valores no funcionarán. | ||
-La propiedad`"prototype"`solo tiene un efecto tan especial cuando se establece en una función de constructor, y se invoca con `new`. | ||
En los objetos normales, el`prototype`no es nada especial: | ||
```js | ||
let user = { | ||
name: "John", | ||
prototype: "Bla-bla" //sin magia en absoluto | ||
}; | ||
``` | ||
Por defecto, todas las funciones tienen`F.prototype = {constructor: F}`,por lo que podemos obtener elconstructorde un objeto accediendo a su propiedad`"constructor"`. |