2010-11-24 6 views
5

Gregogy сделал сообщение о Rebol и JavaScript здесь http://blog.revolucent.net/2009/05/javascript-rebol.htmlДействительно ли Rebol имеет эквивалент для свойства прототипа javascript?

Но, как я иду глубже в сравнивающих JavaScript и Rebol, я не могу увидеть, что эквивалентно Rebol для яваскрипта прототипа. Поскольку расширение экземпляра объекта из другого с make в rebol не совсем похоже на свойство прототипа javascript, поскольку прототип js позволяет распространять ВСЕ экземпляры одновременно.

Так я ошибаюсь, или есть эквивалент коды ниже для 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> 

Обновления: Я не забочусь о синтаксическом сахаре, конечно. Ничто не препятствует расширению в R2, просто переопределяя объект. Мой вопрос заключается не в расширении объекта INSTANCE, а в расширении ВСЕХ ИНСТАНЦИЙ сразу: это то, что позволяет свойство прототипа js.

Итак, чтобы переформулировать мой вопрос: Может ли Rebol разрешить также расширить АВТОМАТИЧЕСКИ ВСЕ УСТАНОВКИ детей, расширив родительский класс, как javascript, независимо от того, какой синтаксис мне неинтересен?

Для обеспечения уверенности я вижу разницу между R2 и R3 для одного экземпляра, но что касается функциональности языка, у меня нет автоматического расширения всех объектов для детей, что является большой нагрузкой, поскольку мне придется самостоятельно управлять ими, будет довольно медленным, так как это не выполняется самой системой. Что делать, если я хочу создать фреймворк вроде jquery, который сильно зависит от такого рода функций? Это было бы большой проблемой.

+0

Сравнение языков в синтаксисе довольно ... глупо. Конечно, будут общие черты, особенно если они оба являются функциональными языками с концепциями, взятыми из Self, Lisp и Scheme ... Посмотрите, насколько CoffeeScript похож на JavaScript или сравнивает его с Groovy в этом отношении = P – BGerrissen 2010-11-24 22:35:58

+0

Кто говорит о сравнении синтаксиса ? Конечно, это касается возможности сравнения. Мне не важно 1 цент о синтаксисе. – 2010-11-25 18:52:30

+0

Я никогда не делал таких претензий в своем блоге, учебнике Rebol, но я рад, что в итоге вы узнали больше о REBOL. Языки прототипа могут работать несколькими способами. REBOL - это прототип языка, потому что вы создаете новые объекты на основе существующих объектов, а не спецификаций классов. – 2011-03-06 04:47:00

ответ

6

REBOL не имеет эквивалента.

объекта в R3 создается с помощью любого другого объекта в качестве прототипа. Но однажды, созданный, он является независимым объектом. Изменения в объекте, который использовался в качестве прототипа, не повлияют на новый объект - или наоборот.

Объекты в REBOL 2, после создания, не могут добавлять к ним новые поля; все, что вы действительно можете сделать, это создать новый объект на основе старого, но с новыми полями. Это может быть раздражающим, так как может нарушить ссылки на старый объект.

REBOL 3 намного лучше. extend и append позволяют добавлять новые поля к любому объекту.


Этот скрипт может помочь немного: link text.

  • Он сравнивает целевой объект в эталонного объекта, и добавляет любые недостающие поля:
  • Это REBOL 2 кода, так что целевой объект получает заменить копией , а не продлен
  • но это рекурсию через любые вложенные объекты, так что он может сделать сложные вложенные изменения в один проход
+0

Sunanda Я не вижу реальной разницы между R3 и R2 на этой точке, кроме синтаксического сахара. Ничто не препятствует расширению в R2, просто переопределяя объект. Мой вопрос заключается не в расширении объекта INSTANCE, а в расширении ВСЕХ ИНСТАНЦИЙ сразу: это то, что позволяет свойство прототипа js. – 2010-11-25 18:55:09

3

Rebol Учебное пособие, ваши Reacti слишком много «я не забочусь», вам не кажется?И, кстати, дизайн мудрый - кто на подкармливании пришел с идеей определения класса, влияющего на живые объекты после того, как была создана экземпляр класса? :-)

Итак, вы действительно делали какие-либо измерения, чтобы сравнить, как медленно продлить связанные объекты в цикле? Ваше утверждение «... будет довольно медленным» может показаться необоснованным.

Давайте делать некоторые измерения:

OBJ: контекст [а: 1] == сделать объект! [ : с 1 ]

дт петли 1'000'000 [добавить копию BLK OBJ] == 0: 00: 00,023372

длина? BLK == 1 миллион

дт [Еогеасп OBJ BLK [добавить OBJ [B: 2]]] == 0: 00: 02,677348

длину? blk == 1000000

blk/1 == сделать объект! [ : с 1 б: 2 ]

BLK/2 == сделать объект! [ : с 1 б: 2 ]

BLK/1/а: 3 == 3

BLK/1 == сделать объект! [ : с 3 б: 2 ]

BLK/2 == сделать объект! [ : с 1 б: 2 ]

Итак, как вы можете видеть, мне удалось продлить 1 млн объектов с помощью пользовательских полей в == 0: 00: 02,677348 времени. Я на 4-летнем компьютере. Сколько объектов есть у вашего приложения?

Я знаю, что это не то, что вы, вероятно, хотите, как вы должны создать список объектов, продлить, но это стартер :-)

-pekr-

1

Я думаю, вы не понравится от какой-либо причине:

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 

Я должен сказать, что я не хотел бы использовать код, как этот в реальной, как я не вижу причин, почему я должен смешивать данные с функциями. Это просто попытка подражать вашему JS-коду.

Но я думаю, у вас есть неправильный пример, и вы хотите, чтобы показать это:

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

Чем я должен сказать, что в REBOL что-то вроде этого не поддерживается, по крайней мере, сейчас.

7

Oldes прав, JT-образное прототипирование в REBOL по умолчанию отсутствует. Но вы можете создавать собственные функции, соответствующие вашим потребностям. Вот простой пример, который использует вложенный контекст для обмена цен между несколькими экземплярами для имитации прототипирования 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 

 Смежные вопросы

  • Нет связанных вопросов^_^