Definiendo las funciones get y set

  • Enlace amigable (slug) de la revisión: Guía_JavaScript_1.5/Crear_nuevos_objetos/Definiendo_las_funciones_get_y_set
  • Título de la revisión: Definiendo las funciones get y set
  • Id de la revisión: 291970
  • Creada:
  • Creador: Mgjbot
  • ¿Es la revisión actual? No
  • Comentario robot Añadido: [[en:Core JavaScript 1.5 Guide:Creating New Objects:Defining Getters and Setters]] <<langbot>>

Contenido de la revisión

Definiendo Obtenedores y Modificadores

Un obtenedor {{mediawiki.external('getter')}} es un método que obtiene el valor de una propiedad específica. Un modificador {{mediawiki.external('setter')}} es un método que configura o modifica el valor de una propiedad específica. Puede definir obtenedores y modificadores de cualquier núcleo de un objeto definido o de un definido objeto de usuario que soporte la adición de nuevas propiedades. La sintaxis para la definción de un obtenedor y un modificador utiliza la sintaxis literal de un objeto.

La siguiente sesión del shell de JS ilustra como los obtenedores y modificadores podrían trabajar para un definido objeto de usuario "o". El shell de JS es una aplicación que permite a los desarrolladores el testear o probar código JavaScript en modo por lotes {{mediawiki.external('batch mode')}} o interactivamente.

Las propiedades del objeto o son:

  • o.a - un número
  • o.b - un obtenedor que retorna o.a más 1
  • o.c - un modificador que configura el valor de o.a a la mitad de su valor
js> o = new Object;
[object Object]
js> o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}};
[object Object]
js> o.a
7
js> o.b
8
js> o.c = 50
js> o.a
25
js>

Esta sesión shell de JavaScript ilustra como los obtenedores y los modificadores pueden extender el prototipo Date para añadir la propiedad año a todas las instancias de la clase predefinida Date. Esta utiliza los métodos getFullYear y setFullYear existentes de la clase Date para soportar los obtenedores y modificadores de la propiedad year.

Estas sentencias definen un obtenedor y un modificador para la propiedad year:

js> var d = Date.prototype;
js> d.__defineGetter__("year", function() { return this.getFullYear(); });
js> d.__defineSetter__("year", function(y) { this.setFullYear(y); });

Estas sentencias utilizan el obtenedor y modificador en un objeto Date:

js> var ahora = new Date;
js> print(ahora.year); //la propiedad año incluida en el prototipo es considerada como un get(año)
2000
js> ahora.year=2001; //la propiedad año incluida en el prototipo es considerada como un set(año)
987617605170
js> print(year);
Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001
Durante el desarrollo de JavaScript 1.5, hubo un corto período en el cual las expresiones incluían getter = o setter = que fueron utilizados para definir nuevos obtenedores o modificadores sobre objetos existentes. Esta sintaxis es ahora altamente desaprobada, causará una alerta o {{mediawiki.external('warning')}} en los motores JS 1.5 y llegarían a convertirse en un error de sintaxis en el futuro. Esta sintaxis debe ser evitada.

Resumen

En principio, los obtenedores y modificadores pueden ser tanto:

  • definidos utilizando Objetos Iniciadores, o
  • añadidos posteriormene a cualquier objeto en cualquier tiempo utilizando un método añadido obtenedor o modificador.

Cuando se definen obtenedores y modificadores utilizando Objetos Iniciadores todo lo que necesita hacer es prefijar un método obtenedor con get y un método modificador con set. Por supuesto, el método obtenedor no deberá esperar un parámetro, mientras que un método modificador espera exactament un parámetro (el nuevo valor para modificar). Por ejemplo:

o = {
  a:7,
  get b() { return this.a+1; },
  set c(x) { this.a = x/2; }
};

Los obtenedores y modificadores también pueden ser añadidos a un objeto en cualquier tiempo despues de la creación utilizando dos métodos especiales llamados __defineGetter__ y __defineSetter__. Ambos métodos experan el nombre de el obtenedor o modificador como su primer parámetro, en forma de una cadena. El segundo parámetro es la funciona a invocarse como obtenedor o modificador. Por ejemplo (siguiendo el ejemplo anterior):

o.__defineGetter__("b", function() { return this.a+1; });
o.__defineSetter__("c", function(x) { this.a = x/2; });

Cualesquiera de las dos formas dependen de su estilo de programación y de la tarea actual a programarse. Si ya se decide por utilizar un objeto iniciador cuando define un prototipo problemente la mayor parte del tiempo deberá escoger la primera forma. Esta forma es más compacta y natural. Sin embargo, si necesita añadir obtenedores y modificadores posteriormente – debido a que no escribió el prototipo o un objeto particular – entonces la segunda forma es la única posible manera. La segunda forma probablemente represente mejor la naturaleza dinámica de JavaScript – pero puede hacer del código difícil de leer y entender.

{{template.AnteriorSiguiente("Guía JavaScript 1.5:Crear nuevos objetos:Usando this para referirse al objeto", "Guía JavaScript 1.5:Crear nuevos objetos:Borrando propiedades")}}

{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "fr": "fr/Guide_JavaScript_1.5/Cr\u00e9ation_d\'objets/D\u00e9finition_d\'accesseurs_et_de_mutateurs", "ja": "ja/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "ko": "ko/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Tworzenie_nowych_obiekt\u00f3w/Definiowanie_metod_pobierania_i_ustawiania" } ) }}

Fuente de la revisión

<p>
</p>
<h3 name="Definiendo_Obtenedores_y_Modificadores"> Definiendo Obtenedores y Modificadores </h3>
<p>Un obtenedor {{mediawiki.external('getter')}} es un método que obtiene el valor de una propiedad específica. Un modificador {{mediawiki.external('setter')}} es un método que configura o modifica el valor de una propiedad específica. Puede definir obtenedores y modificadores de cualquier núcleo de un objeto definido o de un definido objeto de usuario que soporte la adición de nuevas propiedades. La sintaxis para la definción de un obtenedor y un modificador utiliza la sintaxis literal de un objeto.
</p><p>La siguiente sesión del shell de JS ilustra como los obtenedores y modificadores podrían trabajar para un definido objeto de usuario "o". El <a href="es/Introduction_to_the_JavaScript_shell">shell de JS</a> es una aplicación que permite a los desarrolladores el testear o probar código JavaScript en modo por lotes {{mediawiki.external('batch mode')}} o interactivamente.
</p><p>Las propiedades del objeto <code>o</code> son:
</p>
<ul><li> o.a - un número
</li><li> o.b - un obtenedor que retorna o.a más 1
</li><li> o.c - un modificador que configura el valor de o.a a la mitad de su valor
</li></ul>
<pre>js&gt; o = new Object;
[object Object]
js&gt; o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}};
[object Object]
js&gt; o.a
7
js&gt; o.b
8
js&gt; o.c = 50
js&gt; o.a
25
js&gt;
</pre>
<p>Esta sesión shell de JavaScript ilustra como los obtenedores y los modificadores pueden extender el prototipo Date para añadir la propiedad año a todas las instancias de la clase predefinida <code>Date</code>. Esta utiliza los métodos <code>getFullYear</code> y <code>setFullYear</code> existentes de la clase <code>Date</code> para soportar los obtenedores y modificadores de la propiedad year.
</p><p>Estas sentencias definen un obtenedor y un modificador para la propiedad year:
</p>
<pre>js&gt; var d = Date.prototype;
js&gt; d.__defineGetter__("year", function() { return this.getFullYear(); });
js&gt; d.__defineSetter__("year", function(y) { this.setFullYear(y); });
</pre>
<p>Estas sentencias utilizan el obtenedor y modificador en un objeto <code>Date</code>:
</p>
<pre>js&gt; var ahora = new Date;
js&gt; print(ahora.year); //la propiedad año incluida en el prototipo es considerada como un get(año)
2000
js&gt; ahora.year=2001; //la propiedad año incluida en el prototipo es considerada como un set(año)
987617605170
js&gt; print(year);
Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001
</pre>
<div class="tip">Durante el desarrollo de JavaScript 1.5, hubo un corto período en el cual las expresiones incluían <code>getter =</code> o <code>setter =</code> que fueron utilizados para definir nuevos obtenedores o modificadores sobre objetos existentes.  Esta sintaxis es ahora altamente desaprobada, causará una alerta o {{mediawiki.external('warning')}} en los motores JS 1.5  y llegarían a convertirse en un error de sintaxis en el futuro.  Esta sintaxis debe ser evitada.</div>
<h3 name="Resumen"> Resumen </h3>
<p>En principio, los obtenedores y modificadores pueden ser tanto:
</p>
<ul><li> definidos utilizando <a href="es/Gu%c3%ada_JavaScript_1.5/Crear_nuevos_objetos/Utilizando_Objetos_Iniciadores">Objetos Iniciadores</a>, o
</li><li> añadidos posteriormene a cualquier objeto en cualquier tiempo utilizando un método añadido obtenedor o modificador.
</li></ul>
<p>Cuando se definen obtenedores y modificadores utilizando <a href="es/Gu%c3%ada_JavaScript_1.5/Crear_nuevos_objetos/Utilizando_Objetos_Iniciadores">Objetos Iniciadores</a> todo lo que necesita hacer es prefijar un método obtenedor con <code>get</code> y un método modificador con <code>set</code>. Por supuesto, el método obtenedor no deberá esperar un parámetro, mientras que un método modificador espera exactament un parámetro (el nuevo valor para modificar). Por ejemplo:
</p>
<pre class="eval">o = {
  a:7,
  <b>get</b> b() { return this.a+1; },
  <b>set</b> c(x) { this.a = x/2; }
};
</pre>
<p>Los obtenedores y modificadores también pueden ser añadidos a un objeto en cualquier tiempo despues de la creación utilizando dos métodos especiales llamados <code>__defineGetter__</code> y <code>__defineSetter__</code>. Ambos métodos experan el nombre de el obtenedor o modificador como su primer parámetro, en forma de una cadena. El segundo parámetro es la funciona a invocarse como obtenedor o modificador. Por ejemplo (siguiendo el ejemplo anterior):
</p>
<pre class="eval">o.__defineGetter__("b", function() { return this.a+1; });
o.__defineSetter__("c", function(x) { this.a = x/2; });
</pre>
<p>Cualesquiera de las dos formas dependen de su estilo de programación y de la tarea actual a programarse. Si ya se decide por utilizar un objeto iniciador cuando define un prototipo problemente la mayor parte del tiempo deberá escoger la primera forma. Esta forma es más compacta y natural. Sin embargo, si necesita añadir obtenedores y modificadores posteriormente – debido a que no escribió el prototipo o un objeto particular – entonces la segunda forma es la única posible manera. La segunda forma probablemente represente mejor la naturaleza dinámica de JavaScript – pero puede hacer del código difícil de leer y entender.
</p><p>{{template.AnteriorSiguiente("Guía JavaScript 1.5:Crear nuevos objetos:Usando this para referirse al objeto", "Guía JavaScript 1.5:Crear nuevos objetos:Borrando propiedades")}}
</p>
<div class="noinclude">
</div>
{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "fr": "fr/Guide_JavaScript_1.5/Cr\u00e9ation_d\'objets/D\u00e9finition_d\'accesseurs_et_de_mutateurs", "ja": "ja/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "ko": "ko/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Tworzenie_nowych_obiekt\u00f3w/Definiowanie_metod_pobierania_i_ustawiania" } ) }}
Revertir a esta revisión