2010-11-24 8 views
5

Gregogy ha hecho un post sobre rebol y javascript aquí http://blog.revolucent.net/2009/05/javascript-rebol.html¿Rebol realmente tiene un equivalente para la propiedad de prototipo javascript?

Pero como voy profundo en que comparan javascript y rebol, no puede ver lo que es el equivalente de rebol JavaScript prototipo. Debido a que extender una instancia de objeto desde otra con make in rebol no es exactamente como la propiedad de prototipo de JavaScript, ya que js prototype permite extender TODAS las instancias a la vez.

Así que estoy equivocado o hay un equivalente del código de abajo para rebol:

<html> 
<head> 
</head> 

<body> 
    <script>   
    function Person(firstName, lastName, sex) { 
     this.firstName = firstName; 
     this.lastName = lastName;  
     this.whoAreYou = function() { 
     alert("I've been built with Constructor and my name is " + this.firstName + " " + this.lastName); 
     } 
     this.WhatIsYourSex = function() { 
     alert(this.sex); 
     } 
    }; 

    Person.prototype.sex = "Man"; 

    </script> 

    <script> 
    JaneDoe = new Person("Jane", "Doe"); 
    JaneDoe.whoAreYou(); 
    JaneDoe.WhatIsYourSex(); 
    alert("Are you sure?"); 
    JaneDoe.sex = "Woman"; 
    JaneDoe.WhatIsYourSex(); 
    </script> 

</body> 
</html> 

Actualización: No me importa sobre el azúcar sintáctica, por supuesto. Nada impide la extensión en R2 simplemente redefiniendo un objeto. Mi pregunta no es sobre la extensión de un objeto INSTANCE sino sobre la extensión de TODAS LAS INSTANCIAS a la vez: eso es lo que permite la propiedad del prototipo js.

Así que para reformular mi pregunta: Can Rebol también permite extender AUTOMÁTICAMENTE TODAS LAS INSTANCIAS de los niños extendiendo la clase padre como javascript, cualquiera que sea la sintaxis no me importa?

Para un rendimiento seguro, veo la diferencia entre R2 y R3 para una instancia pero en cuanto a la función funcional del idioma no tengo la extensión automática de todos los objetos secundarios, lo cual es una gran carga ya que tendré que gestionarlos yo mismo, que será bastante lento ya que el sistema no lo hace. ¿Qué sucede si quiero crear un marco como jquery que dependa en gran medida de este tipo de características? Sería una gran molestia.

+0

Comparar los lenguajes en la sintaxis es bastante ... tonto. Por supuesto, habrá similitudes, especialmente si ambos son lenguajes funcionales con conceptos tomados de Self, Lisp y Scheme ... Vea cuánto CoffeeScript se parece a JavaScript o compárelo con Groovy para ese asunto = P – BGerrissen

+0

¿Quién habla de comparar la sintaxis? ? Se trata de comparar capacidades, por supuesto. No me importa 1 centavo acerca de la sintaxis. –

+0

Nunca hice ningún reclamo de ese tipo en mi publicación de blog, Rebol Tutorial, pero me alegro de que terminó haciéndolo aprender más acerca de REBOL. Los lenguajes prototipo pueden funcionar de diferentes maneras. REBOL es un lenguaje prototipo porque crea objetos nuevos en función de los objetos existentes en lugar de las especificaciones de clase. –

Respuesta

6

REBOL no tiene equivalente.

Un objeto en R3 se crea utilizando cualquier otro objeto como prototipo. Pero una vez, creado, es una entidad independiente. Los cambios en el objeto que se usó como prototipo no afectarán al objeto más nuevo, o viceversa.

Los objetos en REBOL 2, una vez creados, no pueden tener nuevos campos agregados a ellos; todo lo que realmente puede hacer es crear un nuevo objeto basado en el anterior, pero con nuevos campos. Eso puede ser molesto, ya que puede romper las referencias al viejo objeto.

REBOL 3 es mucho mejor de esa manera. extender y anexar permite agregar nuevos campos a cualquier objeto.


Este script puede ayudar un poco: link text.

  • Se compara un objeto de destino a un objeto de referencia, y añade ningún campos faltantes:
  • Es REBOL 2 código, por lo que el objeto de destino se reemplazado de una copia en lugar de extenderse
  • pero no recursivo utilizando otros objetos anidados, por lo que puede hacer cambios complejos anidados en una sola pasada
+0

Sunanda No puedo ver la diferencia real entre R3 y R2 en ese punto excepto el azúcar sintético. Nada impide la extensión en R2 simplemente redefiniendo un objeto. Mi pregunta no es sobre la extensión de un objeto INSTANCE sino sobre la extensión de TODAS LAS INSTANCIAS a la vez: eso es lo que permite la propiedad del prototipo js. –

+0

Verá la diferencia si tiene múltiples referencias al mismo objeto (por ejemplo, está almacenado como blk1/3 y blk2/7). En REBOL 2 tendrías que reemplazarlos a los dos. Con REBOL 3, puede extender cualquier referencia. Intenta jugar y ver. – Sunanda

+0

Para el rendimiento seguro veo la diferencia, pero en cuanto a la función funcional del lenguaje no tengo la extensión automática de todos los objetos secundarios, lo cual es una gran carga ya que tendré que gestionarlos, lo cual será bastante lento ya que no lo hace sistema en sí –

3

Rebol tutorial, el Reacti ons contienen demasiado de "No me importa", ¿no crees?Y, por cierto, sabio en cuanto al diseño: ¿quién en el mundo llegó con la idea de una definición de clase que influyera en los objetos en vivo después de la instanciación de clase? :-)

Entonces, ¿realmente hizo alguna medida, para comparar qué tan lento es extender objetos relacionados en un bucle? Su afirmación "... será bastante lenta" podría mostrarse como infundada.

Vamos a hacer algunas mediciones:

obj: contexto [a: 1] == Hacer que el objeto! [ a: 1 ]

bucle dt 1'000'000 [anexar blk copia obj] == 0: 00: 00,023372

longitud? blk == 1.000.000

dt [foreach obj blk [anexar obj [b: 2]]] == 0: 00: 02,677348

longitud? blk == 1000000

blk/1 == make object! [ a: 1 b: 2 ]

blk/2 == Hacer que el objeto! [ a: 1 b: 2 ]

blk/1/a: 3 == 3

blk/1 == Hacer que el objeto! [ a: 3 b: 2 ]

blk/2 == Hacer que el objeto! [ a: 1 b: 2 ]

Por lo tanto, como se puede ver, que logró aumentar de 1 millón de objetos con campos personalizados en == 0: 00: 02,677348 tiempo. Estoy en la máquina de 4 años. ¿Cuántos objetos tiene su aplicación?

Yo sé que no es lo que probablemente desee, ya que tienes a la lista de objetos para extender la construcción, pero es un motor de arranque :-)

-pekr-

+0

Tu ejemplo es contrieved. En el mundo real, tendrás una jerarquía de objetos. Como Rebol no administrará este árbol para usted, será una gran carga para el desarrollador. No es bueno para un lenguaje que se supone que es más fácil que otros. También en otros campos, como el análisis de feeds rss para construir un agregador, encontré que el rebol era demasiado lento y tuve que volver a php. Entonces, en el mundo real, ahora temo que Rebol no sea lo suficientemente robusto excepto para los gurús que lo piratean. Pero no soy un gurú y muchos tampoco lo son. Si quiere que Rebol sea más fácil, debería ser más fácil para tareas complejas, no para tareas fáciles. –

+2

Una vez más, las afirmaciones como "demasiado lento" y la mención de "volver a php" no son verdad para mí, especialmente cuando no se proporciona una descripción del problema en cuestión. Cuando se usa un idioma, se trata de utilizar sus instalaciones naturales y ajustar sus alores a lo que ofrece. La traducción directa de 1: 1 del código fuente nunca funciona correctamente. Max tiene un sistema de objetos basado en nodos en Rebol, que puede manejar millones de nodos, lo suficientemente rápido como para ser utilizado en aplicaciones de la vida real. Se trata de la mentalidad utilizada al crear una solución en particular, y debes reajustar las herramientas, o quedarte con - PHP, JS. –

+0

Este es el tipo de problema que se encuentra con rebol http://stackoverflow.com/questions/4297653/rebol-problem-with-not-enough-memory por lo que cuando voy a utilizar esta extensión en mi ejemplo, espero lo que usualmente encuentro con rebol: la pared :) –

1

supongo que no te gustará este desde alguna razón:

person: context [ 
    firstName: secondName: none 
    whoAreYou: does [print [firstName secondName]] 
    WhatIsYourSex: does [print sex] 
] 
extend person 'sex "male" 
JaneDoe: make person [firstName: "Jane" secondName: "Doe"] 
JaneDoe/whoAreYou 
JaneDoe/WhatIsYourSex 
ask "Are you sure?" 
JaneDoe/sex: "female" 
JaneDoe/WhatIsYourSex 

debo decir, que no iba a usar un código como éste en el sector, ya que no veo razón por la que hay que mezclar los datos con las funciones. Es solo un intento de imitar tu código JS.

Pero supongo, tiene mal ejemplo y que desea mostrar esto:

<script> 
    JaneDoe = new Person("Jane", "Doe"); 
    DoeJane = new Person("Doe", "Jane"); 
    Person.prototype.sex = "Man"; 
    JaneDoe.WhatIsYourSex(); 
    DoeJane.WhatIsYourSex(); 
</script> 

De lo que hay que decir, que en REBOL algo como esto no es compatible, por lo menos ahora.

+0

Tu código no refleja la misma intención que mi código js; la intención de mi código js era mostrar que el prototipo en js permite propagar cambios a todas las instancias a la vez, mientras que en rebol no puedes hacerlo. Para ser más explícito con el prototipo js, ​​puede simular fácilmente la herencia de clase y crear frameworks potentes como jquery. –

+0

Como puede ver, corregí su ejemplo para mostrar lo que quería mostrar en la segunda parte de mi respuesta. Su ejemplo no estaba propagando el cambio en todas las instancias.También creo que puedes simular la propagación en REBOL, pero requeriría algo de trabajo, para lo cual no tengo tiempo en este momento. – Oldes

+0

También, ¿a qué te refieres cuando dices: "con el prototipo js puedes simular fácilmente la herencia de clases"? JS es ECMAScript y tiene herencia de clases, por lo que no tienes que simular algo, ¿o sí? – Oldes

7

Oldes tiene razón, el prototipo JS-like no está presente en REBOL por defecto. Pero puede crear una funcionalidad propia que se adapte a sus necesidades. Aquí hay un ejemplo simple que usa el contexto anidado para compartir el valor entre varias instancias para simular el prototipo JS:

creature: func [ 
    /prototype 
     field [word!] 
     value [any-type!] 
    /local result proto 
][ 
    proto: [ 
     context [ 
      static: context [ 
       vars: reduce [ 
        'kind "Monkey" 
       ] 
       extend: func [ 
        blk [block!] 
        field [word!] 
        value [any-type!] 
        /local pos 
       ][ 
        either pos: find/skip blk field 2 [ 
         change/only next pos :value 
        ][ 
         insert/only insert tail blk reduce field :value 
        ] 
        :value 
       ] 

       get: func [ 
        field [word!] 
       ][ 
        all [ 
         field: any [ 
          select/skip this/instance field 2 
          select/skip vars field 2 
         ] 
         first field 
        ] 
       ] 

       set: func [ 
        field [word!] 
        value [any-type!] 
       ][ 

        extend this/instance field :value 
       ] 

       prototype: func [ 
        field [word!] 
        value [any-type!] 
       ][ 
        extend vars field :value 
       ] 

       who-are-you: does [ 
        print ["Hello I'm" this/get 'kind this/get 'sex this/get 'first-name join this/get 'last-name "."] 
       ] 
      ] 

      instance: reduce [ 
       'first-name none 
       'last-name none 
      ] 

      ;exported "API" 
      get: system/words/get in static 'get 
      set: system/words/get in static 'set 
      prototype: system/words/get in static 'prototype 
      who-are-you: system/words/get in static 'who-are-you 

      this: none 
     ] 
    ] 
    unless object? proto/1 [result: reduce proto append clear proto result] 

    if prototype [proto/1/prototype field :value] 

    result: make proto/1 [] 
    result/this: result 
] 

creature/prototype 'sex "male" 


jane: make creature [] 
jane/set 'first-name "Jane" 
jane/set 'last-name "Rebol" 

john: make creature [] 
john/set 'first-name "John" 
john/set 'last-name "Doe" 

jane/who-are-you 

jane/set 'sex "female" 

jane/who-are-you 

john/who-are-you 

creature/prototype 'kind "Human" 

jane/who-are-you 
john/who-are-you 
Cuestiones relacionadas