En cuanto toSource en una solución completa de la serializaciónProblema¿Quieres una solución para convertir toSource en una solución completa de serialización. Teoría de Mozilla ha desarrollado un método muy inteligente llamado toSource. Uso toSource, es posible serializar el estado de un objeto en un búfer. Considere el siguiente ejemplo de declaración de tipo. Fuente: / web / ROOT / artículos AJAX / JavaScript / DefinedClass función tosource.html () (this.localvalue = 10; this.localmethod = function (param) (info ( "DefinedClass.localmethod", "me llamó");)) El tipo DefinedClass ha definido un método localmethod y un miembro de datos localvalue. Cuando el tipo se crea una instancia, el tipo de instancia tiene un método toSource que se puede llamar, como se ilustra en el siguiente código fuente. Fuente: / web / ROOT / artículos AJAX / JavaScript / tosource.html CLS var = DefinedClass nuevo (); cls.prototypemethod.value = 100; info ( "mozilla_tosource", cls.toSource ()); Cuando se llama a toSource, se genera el siguiente búfer: (Localvalue: 10, localmethod: (function (param) (info ( "DefinedClass.localmethod", "me llamó ");})) El buffer generado es una forma de serie de una instancia de objeto. Que falta de la serialización es la definición de tipo. Cuando la instancia del objeto se vuelve a crear, recrear es el estado del objeto. Sin embargo, esto no es del todo cierto, porque la declaración siguiente prototipo se pierde por toSource. Fuente: / web / ROOT / artículos AJAX / JavaScript / tosource.html DefinedClass.prototype.prototypevalue = StaticClass nuevo ();
Todo lo que se declara a través de la propiedad DefinedClass.prototype se pierde por la aplicación toSource. Falta la base de las propiedades y métodos tiene sentido si el buffer toSource debían contener una referencia al tipo que ha creado la instancia. Sin embargo, no hay ninguna referencia a los métodos y propiedades que faltan, y no ayuda en cualquier otro navegador que Mozilla / Firefox. Entonces, ¿cuál es el uso de toSource? ToSource El método por sí solo es limitada, pero la idea detrás de toSource es bueno. Queremos que la capacidad de serializar un objeto de consumo más tarde, y como se muestra en artículos posteriores, la serialización es la clave para la aplicación objeto de diversas técnicas de orientación, como mixins. Como se ilustra en la aplicación de Mozilla de toSource, la serialización puede tener diferentes facetas . Antes de iniciar una implementación de la serialización, vamos a identificar a los diferentes contextos de la serialización: • Serialización de vainilla como toSource: La serialización por defecto proporcionado por Mozilla no está disponible en otros navegadores. Para aquellas aplicaciones Web que hacen toSource uso, es necesario que haya una aplicación para otros navegadores. No serializar las propiedades de prototipo es útil cuando se desea realizar una serie de información adicional y no la información de base. • Declaración completa ejemplo de serialización: Un ejemplo completo de serialización es cuando todos los métodos, propiedades, y los datos de los miembros se convierten en un búfer que, cuando se ejecuta, completamente re-crear el objeto. Cuando la instancia se vuelve a crear, se pierde la información de tipo original. • Serialización Estado Instancia: A diferencia de otros serializations, la serialización del estado es la generación de un buffer que contiene sólo el estado de un objeto, las declaraciones de función no se generan. El JavaScript Object Notation (JSON) protocolo es un ejemplo de un estado ejemplo serialización única. Cuando se serializa el estado ejemplo, los miembros de datos definidos en la propiedad de prototipo están incluidos. • Serialización de asignación de variables: Un ejemplo completo de serialización de declaración incluye todos los del estado de una instancia de objeto, pero las propiedades de la función faltan porque no se utiliza a menudo. Si se utiliza una función de la propiedad, entonces el estado en serie tiene que ser asignado a una variable, de lo contrario, es muy difícil asignar propiedades de la función. • Serialización orientada a objetos:-Object serialización orientada es una extensión de la serialización de vainilla. La razón de la definición de un objeto de serialización orientada a permitir la separación de la clase de datos y los datos específicos del caso. Uso de la serialización objectoriented, un objeto puede ser serializado y re-creado con el comportamiento por defecto. Cada uno de los contextos es un sabor específico de la serialización. La característica común en todos los contextos es que serializar la misma información y filtrar lo que no es necesario. Por ejemplo, los filtros de serialización plain vanilla cualquier propiedad que hace referencia prototipo. Filtros de serialización a cabo todas las funciones del Estado, pero reitera las propiedades de referencia prototipo. Solución Como un primer paso, vamos a crear un general "serializar todo" de aplicación. La aplicación serializar todo se incluyen capacidades de filtrado y la generación de capacidades de salida de control. Uso de la serialización en general requiere un poco de comprensión del proceso de serialización, para que ajuste es posible. En una segunda etapa, vamos a aplicar la serialización de los contextos específicos con la implementación adecuada de filtrado. Seriación de todo lo que significa que la iteración todo lo que se almacena en la instancia del objeto, y luego pedir a la persona que llama si está bien para serializar la información. De un alto nivel, la función de serializar todo lo que se lleva a cabo de la siguiente manera. En el serializar la funcionalidad de todo, dos piezas de funcionalidad se han hecho para efectos de claridad, y se tomó nota de los comentarios / / Removed para mayor claridad. Fuente: / website / root / scripts / Common.js serialize: function (obj, devoluciones de llamada) (var buffer = "("; coma var = function () (coma = function () (return "";) return "";) quoteProperties var = ""; canProcessFilter var = function () (return true;) functionPropertyCallback var = function () () var callingStack if (typeof (arguments [2]) == "undefined") (callingStack = new Array () ; callingStack.push ( "CLS");) else (callingStack = arguments [2];) if (callbacks) (/ / Quitado de claridad) for (propiedad de obj) (if (canProcessFilter (obj [la propiedad], obj, de propiedad)) (switch (typeof (obj [de propiedad])) (/ / Quitado de claridad))) buffer + = ")"; return buffer;) El serializar función tiene dos parámetros, pero para ciertos contextos (explicado más adelante) hay un tercer parámetro. El tercer parámetro se ha dejado fuera para no confundir a las personas que quieren utilizar la función. El primer parámetro, obj, representa la instancia del objeto que se serializa. El segundo parámetro, devolución de llamadas, representa a los métodos de personalización que se llama cuando se serializa los datos. Hasta que el bucle se comenzó a utilizar el por palabra clave, se inicializan las variables. Se definen como sigue: • búfer: Esta variable se utiliza para crear el texto completo que representa el objeto serializado. • coma: Esta variable se utiliza la técnica descrita en el artículo 2.7 para determinar si una coma es necesaria cuando se crea el código JavaScript formato serializado objeto. Como referencia, cada una declaración jurada de patrimonio en un formato de objetos en serie (por ejemplo, (Prop1: true;, Prop2: false)) se separa mediante una coma. La función implementa una técnica en la que la primera vez que se llama, no coma es necesaria, pero para cada llamada, a partir de entonces, una coma es necesaria. Sin utilizar la técnica en el artículo 2.7, a una cuadra de decisiones y la bandera sería necesario. • quoteProperties: Esta variable indica si el buffer contiene una cita doble. La cita se utiliza cuando el objeto a serializar en formato JSON. • canProcessFilter: Esta variable es una llamada a la funcion que se llama para cada valor de dichos objetos. La devolución de llamada devuelve cierto para serializar la propiedad o falso ignorar la propiedad. La devolución de llamada tiene tres parámetros: la propiedad, la referencia de la propiedad real; obj, el objeto se serializa y propertyIdentifier, el identificador de cadena de la propiedad. • functionPropertyCallback: Esta variable es una llamada a la funcion que se llama cuando las propiedades de la iteración de una función. Las propiedades de la función no puede ser almacenado en la variable de amortiguación porque el formato serializado no permite la definición de las propiedades de la función. Las propiedades de una función es necesario asignar después de la definición de la memoria intermedia de JavaScript en serie de objetos. Esta es la razón por la serialización completa de un objeto JavaScript requiere una definición variable. • callingStack: Para asignar una propiedad de la función incrustada en otra declaración objeto de JavaScript, necesita la referencia de objeto en serie (por ejemplo, variable.embeddedobj. Function.value). Para crear la referencia, se utiliza una pila, donde cada elemento de la pila es un objeto de referencia. Después de las declaraciones, las propiedades del objeto son iterados (por (property. ..) en un bucle. Antes de explicar los detalles de la bucle, voy a cubrir la falta de devolución de llamada de inicialización. Fuente: / website / root / scripts / Common.js if (callbacks) (if (callbacks.canProcessFilter) (canProcessFilter = callbacks.canProcessFilter;) if (callbacks.functionPropertyCallback) (functionPropertyCallback = callbacks.functionPropertyCallback;) if (callbacks.variablename) ( callingStack.pop (); callingStack.push (callbacks.variablename);) if (callbacks.quoteProperties) (if (callbacks.quoteProperties == true) (quoteProperties = "\" ";))) El llamador de la serialización no es necesario proporcionar un valor para las devoluciones de llamada. Si no se proporciona ningún valor, una serialización por defecto de todo lo que se supone, con excepción de las propiedades de la función. Las propiedades de la función no son serializados porque no hay ninguna manera en el formato JavaScript serializado objeto asociado a la propiedad una función con la función. Más del código será explicado en breve. Serialización tiene cuatro funciones de devolución de llamada: • canProcessFilter: Se utiliza para determinar si la propiedad puede ser serializado. • functionPropertyCallback: llamado cuando se serializa una propiedad de función. • variableName: Representa el identificador de variable utilizada cuando se genera una serialización de una variable. • quoteProperties: Representa un valor que cuando se establece en true genera comillas el identificador de propiedad. Esto es generalmente utilizado cuando se genera un formato de serialización de JSON. Ahora que hemos visto en los detalles de la inicialización, pasemos a examinar la lógica de la serialización. El bucle es el responsable de serializar la instancia del objeto, y los detalles del ciclo han sido abreviados. En este momento, voy a explicar la estrategia global. En JavaScript, cada método y miembro de datos se puede acceder a un objeto utilizando la siguiente notación: obj.datamember = ... Esta notación es la forma más común de acceder a un método o miembro de datos al escribir el código fuente. Para efectos de serialización no, la notación es útil porque el programador se espera saber lo que los métodos de los datos individuales y los miembros son. A efectos de la serialización, es necesaria la reflexión. Reflexión en JavaScript es un proceso de dos pasos: 1. La cadena de valor de la propiedad identificadores están disponibles mediante una enumeración y reiteró mediante un bucle (por ejemplo, por (la propiedad en obj)). 2. La propiedad real se accede utilizando una notación de matriz, donde la matriz es la instancia del objeto y el índice es la cadena de identificador de valor de la propiedad (por ejemplo, obj [de propiedad]). Como cada propiedad se repite, la serialización de las consultas de primera si la propiedad debe ser serializado llamando a la función de devolución de llamada canProcessFilter. Si la propiedad se pueden serializar, entonces se llama una sentencia switch que las pruebas del tipo de la propiedad. La función devuelve typeof seis identificadores diferentes, de los cuales cinco son de interés (que no están interesados en indefinidos, como no debe ser definido en serie). Los detalles de la sentencia switch son las siguientes. Fuente: / website / root / scripts / Common.js switch (typeof (obj [de propiedad])) (case "boolean": coma buffer + = () + + quoteProperties propiedad quoteProperties + + ":" + object [de propiedad]; break; "El caso de la función": coma buffer + = () + + quoteProperties propiedad quoteProperties + + ":" + obj [de propiedad]. toString (); callingStack.push (propiedad); functionPropertyCallback (obj [de propiedad], obj, los bienes, devolución de llamadas , callingStack); callingStack.pop (); break; case "número": coma buffer + = () + + quoteProperties propiedad quoteProperties + + ":" + obj [de propiedad]; break; case "objeto": callingStack.push ( la propiedad); coma buffer + = () + + quoteProperties propiedad quoteProperties + + ":" + ops.serialize (obj [la propiedad], devolución de llamadas, callingStack); callingStack.pop (); break; case "cadena": buffer + = coma () + + quoteProperties propiedad quoteProperties + + ":" + [objeto de propiedad]; break;) En la ejecución de la sentencia switch, el número de tipos, de cadena y booleanos tienen una aplicación directa de serialización. La serialización de los tipos siguen la convención de [identificador de propiedad]: [valor de la propiedad]. la función y el objeto son más complicadas. Cuando se encuentra un objeto, entonces una serialización JavaScript objeto incrustado se produce y la función de ops.serialization se llama recursivamente. El resultado de la serialización es un valor de propiedad que se agrega a la memoria intermedia de ser devuelto a la persona que llama. Las partes restantes de la función de serializar añadir un tramo rizado para cerrar la serialización y restablecer el buffer generado para el llamante. La serialización se presenta es completa, y cada uno de los contextos se utiliza la función de serialización de generar sus propios generados búfer. Consideremos el la aplicación de la función Serializer.toSource, que imita la serialización toSource Mozilla. Esto significa que cualquier función o miembro de datos se define como parte de la propiedad de prototipo no se procesa. Lo que se pide es determinar si un bien debe ser en serie con un filtro. La aplicación completa de Serializer.toSource siguiente. Fuente: / website / root / scripts / Jaxson / commons.js Serializer.toSource = function (obj) (return ops.serialize (obj, (currProcessedObject: null, iterPrototype: null, canProcessFilter: function (propiedad, currObj, propertyIdentifier) (if ( this.currProcessed! = currObj) (GetPrototypeObject (currObj, función (prototipo) = (this.iterPrototype prototipo;)); this.currProcessed = currObj;) if (typeof (iterPrototype) == "object") (for (prototypeIdentifier en iterPrototype) (if (prototypeIdentifier == propertyIdentifier) (return false;))) return true;)));) En la aplicación de Serialize. toSource es una llamada a un método único, y es a ops.serialize. De forma predeterminada, se ops.serialize serializar todo, y que debe ser evitado. Para ser capaz de distinguir entre una propiedad de instancia y una propiedad definida por la propiedad de prototipo, la aplicación de canProcessFilter tiene que averiguar qué características están asociadas con la instancia. En la implementación del método canProcessFilter es una referencia a GetPrototypeObject. GetPrototypeObject es una conveniencia función utilizada para recuperar la propiedad de prototipos asociados con el objeto. Cubro la aplicación de GetPrototypeObject poco. Por el momento, concentrémonos en lo que sucede en el filtro. Cuando ops.serialize se llama, se iterar las propiedades de la toSerialize objeto. Cuando se recupera de una propiedad, se llama la userdefined canFilterProcess función de filtro. canFilterProcess tiene como segundo parámetro el objeto al que el pronto-a-ser-en serie pertenece a la propiedad. Fuente: / website / root / scripts / Jaxson / commons.js función GetPrototypeObject (obj, callback) (if (typeof (obj.constructor) == "function") (var = funcMatch / función \ s (.*) \ (/; Var result = obj.constructor.toString (). Partido (funcMatch); if (result! = Null) (if (typeof (callback) == "function") (var iterobj if (typeof (resultado [1]) == "string") (eval ( "prototypePropery var =" + resultado [1] + ". prototipo"); de devolución de llamada (prototypePropery, resultado [1]);))))) En la aplicación de GetPrototypeObject, la primera prueba es la verificación de que la propiedad obj.constructor existe realmente. Si la función no existe, entonces no es constructor, y no hay necesidad de continuar. Si la función no existe, entonces una expresión regular se utiliza para extraer el nombre de la función. La expresión regular en el ejemplo de código se muestra en negrita y es reconocido como una expresión regular a causa de las barras. Al usar expresiones regulares en el contexto de una cadena, la función del partido que se llama y devuelve los resultados del partido. Si no hay resultados, entonces se encuentra un identificador que puede ser utilizado para hacer referencia a la propiedad de prototipo. Sin embargo, se encuentra un buffer de texto y no un objeto. El buffer de texto tiene que ser convertido en un objeto, mediante la instrucción eval. El búfer de forma dinámica ejecutado asignará el local declaró prototypeProperty para hacer referencia a la propiedad de prototipo. Luego, utilizando un bloque de código, la propiedad y el identificador de objeto se pasan a la persona que llama. Otro contexto es la serialización de una instancia de objeto que sólo se incluye el estado y no hay funciones. Sin embargo viendo el código, que es fácil adivinar lo que el filtro lo hace. Las pruebas de filtro de código si la propiedad que desea filtrar es un objeto de función. Si la propiedad es un objeto de la función, entonces la propiedad no debe ser filtrada. Y, de hecho, así es como el código del filtro está escrito, como se muestra en el siguiente listado. Fuente: / website / root / scripts / Jaxson / commons.js Serializer.toSourceState = function (obj) (return ops.serialize (obj, (canProcessFilter: function (propiedad, obj, propertyIdentifier) ( if (typeof (propiedad) == "function") (return false;) else (return true;))));) El código en negrita se muestra cómo probar el tipo de objeto con el operador typeof. Otro contexto es la serialización de Estado a la notación JSON. Seriación a JSON es como serializar a un Estado, salvo que los identificadores de propiedad han comillas. El código de serialización es idéntico al código de serialización del estado, excepto que el miembro de datos quoteProperties se establece en true. Fuente: / website / root / scripts / Jaxson / commons.js Serializer.toSourceJSON = function (obj) (return ops.serialize (obj, ( quoteProperties: true,canProcessFilter: function (propiedad, obj, propertyIdentifier) (if (typeof (propiedad) == "function") (return false;) else (return true;))));) Después de examinar los últimos tres contextos de serialización, probablemente pensando que el código es relativamente similar, pero los resultados son muy diferentes. Este es un ejemplo de cómo los bloques de código se pueden utilizar para separar la repetición general de un tratamiento específico. Serialización Otro contexto que va a utilizar que es similar a toSource es serializar con una referencia. El contexto de esta serialización es el siguiente. Está creando un sistema donde un tipo sirve como una funcionalidad básica. Después de una instancia del tipo, las personalizaciones se realizan. Entonces decide serializar el objeto, pero desea serializar sólo las personalizaciones, la razón es que cuando el objeto se vuelve a crear en otro equipo o programa, que desea una funcionalidad de base de diferentes para ser utilizado. Así pues, la misma clase que podía operar con las funcionalidades de base distintos. La solución es no serializar las propiedades de prototipo y luego generar un búfer que crea una instancia del tipo. Nota No me explico la aplicación de la serialización de otros tipos de contexto porque no ilustran todas las técnicas nuevas. Yo sólo cubren cómo utilizar GetPrototypeObject en un contexto diferente y más complicado código de filtro. Si estás interesado en aprender más, eche un vistazo a las normas de prueba en el archivo / web / ROOT / artículos AJAX / JavaScript / tosource.html y, en particular la jaxson_tosource_oo método de ensayo. Serialización en JavaScript parece ser una cosa simple , y el método toSource parece extremadamente útil. Sin embargo, como se discute en este artículo, toSource es incompleta. Cuando se escribe el código JavaScript para serializar, recuerda lo siguiente en mente: • Serie en JavaScript para generar un búfer que es el formato en el formato de objetos de JavaScript. • En este artículo, no buscar la forma de volver a crear el objeto serializado. Esto se debe a que lo hagan sólo requiere pasar el buffer a la declaración de eval y la asignación de los resultados de la eval a una variable. • Serie tiene muchos contextos diferentes. El ops.serialize función implementa una serialización muy general que debe ser especializada. • Cuando se serializa, no hay ninguna información de tipo. Para tener información de tipo, es necesario extraer y luego almacenarlo en alguna parte. Recuerde que JavaScript es un prototipo basado en el lenguaje de programación, y los tipos de JavaScript son diferentes en concepto, en comparación con los tipos de lenguajes como C # y Java. • Las técnicas de serialización de este artículo se muestra cómo definir un algoritmo que utiliza bloques de código para separar un bloque de código general de la iteración de un contexto específico bloque de código. un artículo presentado por Sonja Lande Descargo de responsabilidad:Nuestro sitio web no es responsable por el contenido de este artículo. Webarticles es un recurso de información gratuito. Importante: En este artículo "La clave de toSource en una solución de publicación entera" fue traducida por un software automático. Sentimos pena por los errores de ortografía que pueda haber ocurrido. Gracias por su comprensión.
|
|||||
| Online: 270 users browsing the articles directory |
|
|