Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com

Inicio

 
4D v20.6
Uso de la notación objeto

Uso de la notación objeto  


 

Puede gestionar objetos del lenguaje 4D utilizando la notación objeto para obtener o definir  sus valores. Por motivos de compatibilidad, esta funcionalidad requiere que active explícitamente una opción de compatibilidad. Una vez activada la notación de objetos, puede utilizarla en todas partes en 4D donde se esperen expresiones.

Cada valor de propiedad accedido a través de la notación objeto se considera una expresión. Cuando la notación objeto está habilitada en su base de datos (ver abajo), puede usar estos valores dondequiera que se esperen expresiones 4D:

  • En el código 4D, ya sea escrito en los métodos (editor de métodos) o externalizado (fórmulas, archivos de etiquetas 4D procesados por PROCESS 4D TAGS o el servidor Web, archivos de exportación, documentos 4D Write Pro, etc.)
  • En las áreas Expresión del depurador y del explorador de ejecución,
  • En la lista de propiedades del editor de formularios para los objetos de formularios: campo Variable o Expresión, así como también varias expresiones utilizables en los list box de tipo selección y sus columnas (fuentes de datos, color de fondo, estilo o color de fuente).

Los objetos manipulados mediante la notación de objetos deben haberse inicializado utilizando el comando New object, de lo contrario, el acceso a sus propiedades de lectura y escritura generará un error de sintaxis.

Ejemplo:

 C_OBJECT($obVar//creación de una variable 4D de tipo objeto
 $obVar:=New object //inicialización del objeto y asignación a la variable 4D

El mismo principio aplica a campos de tipo Objeto:

 CREATE RECORD([Person]) //Agregar un nuevo registro a una tabla que contiene un campo objeto
 [Person]Data_o:=New object //Inicialización del objeto y asignación al campo 4D

La notación de objetos se puede utilizar para acceder a valores de propiedad de objeto y a elementos de colección a través de una cadena de tokens.

Con la notación objeto, las propiedades de los objeto se pueden acceder de dos maneras:

  • Utilizando un símbolo "punto":
    object.propertyName

    Ejemplo:
     employee.name:="Smith"
  • Utilizando una cadena entre corchetes:
    object["propertyName"]

    Ejemplo:
     $vName:=employee["name"]

Como el valor de una propiedad de objeto puede ser un objeto o una colección, la notación objeto requiere una secuencia de símbolos para acceder a las sub-propiedades, por ejemplo:

 $vAge:=employee.children[2].age

La notación objeto está disponible con todo elemento de lenguaje que pueda contener o devolver un objeto, es decir:

  • con los objetos mismo (almacenados en variables, campos, propiedades de objetos, arrays de objetos o elementos de colecciones).
    Ejemplos:
     $age:=$myObjVar.employee.age //variable
     $addr:=[Emp]data_obj.address //campo
     $city:=$addr.city //propiedad de un objeto
     $pop:=$aObjCountries{2}.population //array de objetos
     $val:=$myCollection[3].subvalue //elemento de colección
  • con los comandos 4D que devuelven objetos.
    Ejemplo:
     $measures:=Get database measures.DB.tables
  • con los métodos proyecto que devuelven objetos.
    Ejemplo:
      // MyMethod1
     C_OBJECT($0)
     $0:=New object("a";10;"b";20)
     
      //myMethod2
     $result:=MyMethod1.a //10
  • con las Colecciones (sólo la propiedad longitud, ver párrafo siguiente).
    Ejemplo:
     myColl.length //tamaño de la colección
     maxSal:=myColl.max("salary")

Para acceder a un elemento de colección, debe pasar el número del elemento al interior de los corchetes:

collectionName[expression]

Nota: para mayor información sobre las variables de tipo colección, consulte la sección . 

Puede pasar toda expresión 4D válida que devuelva un entero positivo en expresión. Ejemplos:

 myCollection[5]  //acceso al sexto elemento de la colección
 myCollection[$var]

Nota: tenga en cuenta que los elementos de colección están numerados desde 0.

Puede asignar un valor a un elemento de colección mediante la notación objeto:

 myCol[10]:="My new element"

Si este índice de elemento está más allá del último elemento existente de la colección, la colección se redimensiona automáticamente y todos los elementos intermediarios nuevos obtienen el valor null:

 C_COLLECTION(myCol)
 myCol:=New collection("A";"B")
 myCol[5]:="Z"
  //myCol[2]=null
  //myCol[3]=null
  //myCol[4]=null

Propiedad length

La propiedad length está disponible automáticamente para todas las colecciones y devuelve el tamaño de la colección, es decir, el número de elementos que contiene. Puede acceder a esta propiedad de dos maneras:

  • Utilizando un símbolo "punto", por ejemplo:
     $vSize:=myCollection.length
  • Usando una cadena entre corchetes, por ejemplo:
     $vSize:=myCollection["length"]

Tenga en cuenta que la propiedad length sólo se puede leer, no se puede modificar.

Los valores de propiedades se pueden acceder a través de punteros. El uso de la notación de objetos con punteros es muy similar al uso de la notación de objetos directamente con los objetos, excepto que el símbolo "punto" debe omitirse.

  • Acceso directo:
    pointerOnObject->propertyName
  • Acceso por nombre:
    pointerOnObject->["propertyName"]

Ejemplo:

 C_OBJECT(vObj)
 C_POINTER(vPtr)
 vObj:=New object
 vObj.a:=10
 vPtr:=->vObj
 x:=vPtr->a //x=10

Cuando se utiliza la notación de objetos, el valor null se soporta a través del comando Null. Este comando se puede utilizar para asignar o comparar un valor null a las propiedades de los objetos o a los elementos de colecciones, por ejemplo:

 myObject.address.zip:=Null
 Si(myColl[2]=Null)

Para más información, consulte la descripción del comando Null.

La evaluación de una propiedad de objeto a veces puede producir un valor indefinido. Este es el caso, por ejemplo, cuando se escribe:

 C_OBJECT($o)
 $o:=New object("a";2)
 $val:=$o.b //$val es indefinido

Normalmente, al intentar leer o asignar expresiones indefinidas, 4D generará errores. Esto no sucede en los siguientes casos:

  • La lectura de una propiedad de un objeto o valor indefinido devuelve indefinido; asignar un valor indefinido a variables (excepto arrays) tiene el mismo efecto que llamar a CLEAR VARIABLE con ellos:
     C_OBJECT($o)
     C_LONGINT($val)
     $val:=10 //$val=10
     $val:=$o.a //$o.a es indefinido (sin error), y asignar este valor borra la variable
      //$val=0
  • Leer la propiedad length de una colección indefinida produce 0: 
     C_COLLECTION($c//variable creada pero no se define ninguna colección
     $size:=$c.length //$size = 0
  • Un valor indefinido pasado como parámetro a un método de proyecto se convierte automáticamente a 0 o "" según el tipo de parámetro declarado.
     C_OBJECT($o)
     mymethod($o.a) //pasa un parámetro no definido
     
      //En método mymethod
     C_TEXT($1//tipo de parámetro es texto
      // $1 contiene ""
  • Una expresión de condición se convierte automáticamente a false cuando se evalúa como indefinida con las palabras claves If y Case of:
     C_OBJECT($o)
     If($o.a) // false
     End if
     Case of
        :($o.a) // false
     End case
  • Asignar un valor indefinido a una propiedad de objeto existente reinicializa o borra su valor, dependiendo de su tipo:
    • Objeto, colección, puntero: Null
    • Imagen: Imagen vacía
    • Booleano: False
    • Cadena: ""
    • Número: 0
    • Fecha: !00-00-00! si está activada la configuración "Usar tipo de fecha en lugar de formato de fecha ISO en objetos", de lo contrario ""
    • Hora: 0 (número de ms)
    • Indefinido, Null: sin cambio

     C_OBJECT($o)
     $o:=New object("a";2)
     $o.a:=$o.b //$o.a=0

  •   Asignar un valor indefinido a una propiedad de objeto no existente no hace nada.

Cuando se esperan expresiones de un tipo dado en su código 4D, puede asegurarse de que tienen el tipo correcto incluso cuando se evalúan como indefinido rodeándolas con el comando cast 4D apropiado: String, Num, Time, Date, Bool. Estos comandos devuelven un valor vacío del tipo especificado cuando la expresión se evalúa como indefinida. Por ejemplo:

 $myString:=Lowercase(String($o.a.b)) //asegúrese de obtener un valor de cadena incluso si no está definido
  //para evitar errores en el código

Los métodos Formula o Formula from string le permiten crear objetos "fórmula" nativos que puede encapsular en propiedades de objeto:

 C_OBJECT($f)
 $f:=New object
 $f.message:=Formula(ALERT("Hello world"))

Tales propiedades son "métodos objeto", es decir, métodos que están ligados a su objeto principal. Para ejecutar un método almacenado en una propiedad objeto, use el operador ( ) después del nombre de la propiedad, como por ejemplo:

 $f.message() //displays "Hello world"

La sintaxis con corchetes también es soportada:

 $f["message"]() //displays "Hello world"

También puede pasar parámetros a su fórmula cuando la llame utilizando $1, $2… al igual que con los métodos proyecto 4D:

 C_OBJECT($f)
 $f:=New object
 $f.message:=Formula(ALERT("Hello "+$1))
 $f.message("John") //muestra "Hello John"

Tenga en cuenta que, incluso si no tiene parámetros, un método objeto para ser ejecutado debe llamarse con paréntesis ( ). Llamar solo a la propiedad del objeto devolverá una nueva referencia a la fórmula (y no la ejecutará):

 $o:=$f.message //devuelve el objeto de fórmula en $o

Las reglas de nombres de miembros tokens (nombres de propiedades de objetos que se acceden utilizando notación de objetos) son más restrictivas que las que se aplican a los nombres de identificación 4D estándar. Deben cumplir con la gramática del identificador de JavaScript (ver ECMA Script standard):

  • El primer carácter debe ser una letra, un guion bajo (_), o un signo de dólar ($),
  • Los siguientes caracteres pueden ser cualquier letra o dígito o un guion bajo o signo de dólar (los caracteres de espacio NO están permitidos),
  • Son sensibles a mayúsculas y minúsculas.

Notas:

  • No se permite usar un campo tabla como índice de colección, por ejemplo a.b [[Table1]Id]. Debe utilizar una variable intermedia.
  • La creación de atributos de objeto mediante una cadena entre corchetes permite anular las reglas de ECMA Script. Por ejemplo, el atributo $o["My Att.nombre"] es válido en 4D, a pesar del espacio. En este caso, sin embargo, no será posible utilizar la notación de puntos con este atributo.

Atención
Aunque los nombres de propiedades de los objetos pueden contener caracteres especiales como "." o "[ ]" (y están disponibles a través de la sintaxis $o["My Att.name"]), no se recomiendan ya que no podrá realizar consultas u ordenaciones en ellos. Todos los comandos y métodos 4D que ejecutan consultas en las propiedades del objeto, tales como dataClass.query( ) o QUERY BY ATTRIBUTE utilizan una cadena como parámetro rutaPropiedad o rutaAtributo, por ejemplo:

 QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex") //nombre subpropiedad perro

Las consultas y clasificaciones sobre el uso de propiedades que tienen caracteres especiales en su nombre se interpretarán incorrectamente y darán resultados no válidos. Por ejemplo, si definió una propiedad llamada ["A.1.1"], no será posible consultar:

 QUERY BY ATTRIBUTE([Chapter]];[Chapter]code;"A.1.1";=;"Intro@") //nombre de propiedad no válida

En todas las versiones, 4D siempre ha aceptado puntos (.) y corchetes ([y]) en los nombres tokenizados de los objetos de la base de datos (tablas, campos, variables y métodos).

Sin embargo, estos caracteres se utilizan para identificar tokens de lenguaje en la notación de objetos estándar. Por lo tanto, las bases de datos que utilizan nombres que contienen puntos o corchetes no son compatibles con la notación de objetos estándar ya que interpretaciones erróneas podrían romper el código existente. Por ejemplo, si se escribe el siguiente código:

a.b
a.b:=c[1]

...4D no podía saber si a.b y c[1] representan nombres de variables estándar o si b es una propiedad del objeto a y c el segundo elemento de una colección de objetos c.

Por consiguiente:

  • En bases convertidas de versiones anteriores a 4D v17, debe seleccionar una opción específica (ver abajo) que indique que desea utilizar la notación de objetos. Al seleccionar esta opción, usted declara que su código está "listo para la notación de objetos", es decir, no utiliza ningún nombre que contenga "." o "[]".
  • Una funcionalidad específica del CSM le ayuda a detectar los nombres que son incompatibles con la notación de objetos. Es muy recomendable utilizar esta función antes de activar la opción (consulte la sección Página Verificar del capítulo "CSM"). Como es habitual, se recomienda trabajar con una copia del archivo de estructura.
  • A partir de 4D v17 (v16 R4),  los caracteres "." y "[]" ya no se permiten en los nombres de objetos tokenizados.

Para poder utilizar la notación de objetos en bases creadas en versiones anteriores a 4D v17, debe seleccionar la opción Utilizar la notación de objetos para acceder a las propiedades de los objetos (Se requiere Unicode). en la página Compatibilidad del diálogo Configuración de la base de datos:

Esta configuración modificará el estado interno del archivo de estructura y no se puede deshacer. Para más información, consulte Página Compatibilidad.

Nota: los componentes pueden tener una configuración diferente de la base local.

Utilizar notación de objetos simplifica el código 4D mientras se manipulan objetos. Tenga en cuenta, sin embargo, que la notación basada en comandos sigue siendo totalmente soportada.

  • Escribir y leer objetos (este ejemplo compara la notación de objetos y la notación de comandos):

  // Uso de la notación de objetos
 C_OBJECT($myObj//declara un objeto variable 4D
 $myObj:=New object //crea un objeto y lo asigna a la variable
 $myObj.age:=56
 $age:=$myObj.age //56
 
  // Usando la notación de comandos
 C_OBJECT($myObj2//declara un objeto variable 4D
 OB SET($myObj2;"age";42) //crea un objeto y agrega la propiedad age
 $age:=OB Get($myObj2;"age") //42
 
  // Por su puesto, ambas notaciones se pueden mezclar
 C_OBJECT($myObj3)
 OB SET($myObj3;"age";10)</p><ul><li><span id="result_box"lang="es"><span title="Create a property and assign values, including objects: ">Crea una propiedad y asigna valores, incluidos los objetos:
 </span></span></li></ul><p>[#code4D]C_OBJECT($Emp)
 $Emp:=New object
 $Emp.city:="London" //crea la propiedad city y establece su valor en "London"
 $Emp.city:="Paris" //modifica la propiedad city
 $Emp.phone:=New object("office";"123456789";"home";"0011223344")
  //crea la propiedad phone y define su valor en un objeto

  • Obtiene un valor en un sub objeto es muy sencillo utilizando la notación de objeto:

 $vCity:=$Emp.city //"Paris"
 $vPhone:=$Emp.phone.home //"0011223344"

  • Puede acceder a las propiedades como cadenas usando el operador [ ]

 $Emp["city"]:="Berlin" //modifica la propiedad city
  //esto puede ser útil para crear las propiedades con la ayuda de variables
 C_TEXT($addr)
 $addr:="address"
 For($i;1;4)
    $Emp[$addr+String($i)]:=""
 End for
  // crea 4 propiedades vacías "address1...address4" en el objeto $Emp



Ver también 

C_COLLECTION
C_OBJECT
Errores del analizador de notación objeto (-10737 -> -10701)
New collection
New object

 
PROPIEDADES 

Producto: 4D
Tema: Objetos (Lenguaje)

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

Creado por: 4D v16 R4

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v20)
Manual de lenguaje 4D ( 4D v20.1)
Manual de lenguaje 4D ( 4D v20.2)
Manual de lenguaje 4D ( 4D v20.3)
Manual de lenguaje 4D ( 4D v20.4)
Manual de lenguaje 4D ( 4D v20.5)
Manual de lenguaje 4D ( 4D v20.6)