Object.addProperty()

Disponibilidad

Flash Player 6. En archivos de clase externos, puede utilizar get o set en lugar de este método.

Sintaxis

myObject.addProperty(prop, getFunc, setFunc)

Parámetros

prop Nombre de la propiedad de objeto que se debe crear.

getFunc Función que se invoca para recuperar el valor de la propiedad; este parámetro es un objeto de función.

setFunc Función que se invoca para definir el valor de la propiedad; este parámetro es un objeto de función. Si pasa el valor null en este parámetro, la propiedad es de sólo lectura.

Valor devuelto

Devuelve el valor true si la propiedad se crea correctamente; en caso contrario, devuelve false.

Descripción

Método; crea una propiedad de captador/definidor. Cuando Flash lee una propiedad de captador/definidor, invoca la función get y el valor devuelto por la función se convierte en un valor de prop. Cuando Flash escribe una propiedad de captador/definidor, invoca la función set y le pasa el nuevo valor como un parámetro. Si existe una propiedad con ese nombre concreto, la nueva propiedad lo sobrescribe.

La función "get" es una función que no tiene parámetros. El valor devuelto puede ser de cualquier tipo. El tipo de valor puede cambiar según la invocación. El valor devuelto se trata como el valor actual de la propiedad.

La función "set" es una función que acepta un parámetro: el nuevo valor de la propiedad. Por ejemplo, si la propiedad x se asigna mediante la sentencia x = 1, la función set recibirá el parámetro 1 de tipo número. El valor devuelto por la función "set" se pasa por alto.

Puede agregar propiedades de captador/definidor a los objetos prototipo. Si agrega una propiedad de captador/definidor a un objeto prototipo, todas las instancias del objeto que heredan el objeto prototipo heredarán la propiedad de captador/definidor. Esto hace posible agregar una propiedad de captador/definidor a una ubicación, el objeto prototipo, y aplicarla a todas las instancias de una clase (como si se agregaran métodos a objetos prototipo). Si se invoca una función get/set para una propiedad de captador/definidor de un objeto prototipo heredado, la referencia que se pasa a la función get/set será el objeto al que se hizo referencia originalmente, no el objeto prototipo.

Si no se invoca correctamente, Object.addProperty() puede no funcionar y generar un error. En la tabla siguiente se describen los errores que pueden producirse:

Condición de error

Qué sucede

prop no es un nombre de propiedad válido; por ejemplo, una cadena vacía.

Devuelve false y no se agrega la propiedad.

getFunc no es un objeto de función válido.

Devuelve false y no se agrega la propiedad.

setFunc no es un objeto de función válido.

Devuelve false y no se agrega la propiedad.

Ejemplo

Sintaxis 1: objeto que tiene dos métodos internos, setQuantity() y getQuantity(). Puede utilizarse una propiedad, bookcount, para invocar estos métodos cuando se define o recupera. Un tercer método interno, getTitle(), devuelve un valor de sólo lectura asociado a la propiedad bookname:

function Book() {  


this.setQuantity = function(numBooks) { 
this.books = numBooks; }
this.getQuantity = function() { 
  return this.books;
} this.getTitle = function() { return "Catcher in the Rye"; } this.addProperty("bookcount", this.getQuantity, this.setQuantity); this.addProperty("bookname", this.getTitle, null); } myBook = new Book(); myBook.bookcount = 5; order = "Ha solicitado " + myBook.bookcount + " copias de " + myBook.bookname;

Cuando el script recupera el valor de myBook.bookcount, el intérprete de ActionScript invoca automáticamente myBook.getQuantity(). Cuando un script modifica el valor de myBook.bookcount, el intérprete invoca myObject.setQuantity(). La propiedad bookname no especifica una función set, de modo que los intentos de modificar bookname se pasan por alto.

Sintaxis 2: el ejemplo anterior de bookcount y bookname funciona, pero las propiedades bookcount y bookname se añaden a cada instancia del objeto Book. Esto significa que el coste de tener estas propiedades es que haya dos lugares de propiedades para cada instancia del objeto. Si hay muchas propiedades como bookcount y bookname en una clase, es posible que requieran gran cantidad de memoria. En su lugar, puede añadir las propiedades para Book.prototype:

function Book () {}  
Book.prototype.setQuantity = function(numBooks) {  
  this.books = numBooks; 
} 
Book.prototype.getQuantity = function() {  
  return this.books; 
} 
Book.prototype.getTitle = function() {  
  return "Catcher in the Rye";  
}  
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity); 
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
myBook = new Book(); 
myBook.bookcount = 5; 
order = "Ha solicitado "+myBook.bookcount+" copias de "+myBook.bookname;  

Ahora las propiedades bookcount y bookname sólo existen en un lugar: el objeto Book.prototype. El resultado, no obstante, es el mismo que el del código de la sintaxis 1, que añade bookcount y bookname directamente en cada instancia. Si se accede a bookcount o bookname en una instancia Book, la cadena de prototipo asciende y se encuentra la propiedad de captador/definidor en Book.prototype.

Sintaxis 3: las propiedades incorporadas TextField.scroll y TextField.maxscroll son propiedades de captador/definidor. El objeto TextField tiene los métodos internos getScroll(), setScroll() y getMaxScroll(). El constructor TextField crea las propiedades de captador/definidor y las dirige a los métodos internos get/set, tal como se muestra a continuación:

this.addProperty("scroll", this.getScroll, this.setScroll);
this.addProperty("maxscroll", this.getMaxScroll, null);

Cuando un script recupera el valor de myTextField.scroll, el intérprete de ActionScript invoca automáticamente myTextField.getScroll(). Cuando un script modifica el valor de myTextField.scroll, el intérprete invoca myTextField.setScroll(). La propiedad maxscroll no tiene especificada una función set, de modo que los intentos de modificar maxscroll se pasan por alto.

Sintaxis 4: aunque las propiedades TextField.scroll y TextField.maxscroll incorporadas funcionan en el ejemplo de sintaxis 3, las propiedades scroll y maxscroll se añaden a cada una de las instancias del objeto TextField. Esto significa que el coste de tener estas propiedades es que haya dos lugares de propiedades para cada instancia del objeto. Si hay muchas propiedades como scroll y maxscroll en una clase, es posible que requieran gran cantidad de memoria. En su lugar, puede agregar las propiedades scroll y maxscroll a TextField.prototype:

TextField.prototype.addProperty("scroll", this.getScroll, this.setScroll);
TextField.prototype.addProperty("maxscroll", this.getMaxScroll, null);

Ahora, las propiedades scroll y maxscroll sólo existen en un lugar: el objeto TextField.prototype. Sin embargo, el efecto es el mismo que el código anterior, en el que las propiedades scroll y maxscroll se agregaban directamente a cada instancia. Si se accede a scroll o maxscroll desde una instancia TextField, se asciende en la cadena de prototipos y se encuentra la propiedad de captador/definidor de TextField.prototype.