2013-09-06 2 views
1

Я играю с фантастической библиотекой Rickshaw, которая использует Prototype's class-based OOP system. Это включает в себя extend метода, который позволяет подкласс расширить метод в родительском классе, как это:CoffeeScript: Расширение супер-метода, например, в Рикше Пример прототипа

Parent class:

defaults: function() { 
    return { 
    tension: 0.8, 
    // etc... 
    }; 
} 

Sub class:

defaults: function($super) { 
    return Rickshaw.extend($super(), { 
    fill: true, 
    // etc... 
    }); 
} 

Я пытаюсь найти синтаксис сделать то же самое в CoffeeScript, так что CoffeeScript обрабатывает наследование класса, а не Prototype. Вы можете помочь?

EDIT

Благодаря @ tomahaug Ответим я получил эту работу, и я уже понял, что это лучший способ. Хотя $super особенность прототипа, extend фактически определяется как в Prototype и объект Rickshaw верхнего уровня, например:

extend: (destination, source) -> 
    for property of source 
    if (source.hasOwnProperty(property)) 
     destination[property] = source[property] 
    destination 

Так что делает использование этого метода, решение выглядит следующим образом:

defaults:() -> 
    Rickshaw.extend super(), 
    fill: true, 
    // etc... 

Таким образом, единственный способ, которым это может быть улучшено, - это еще один шаг, если окажется, что это каким-то образом встроено в CoffeeScript.

+0

Вы хотите перевести эти два примера в CoffeeScript или вы спрашиваете, может ли система CoffeeOp OScript сделать что-то подобное? – tomahaug

+0

Я перевел его на CoffeeScript, и он работает в основном. Я просто пытаюсь с этим бороться. –

ответ

4

Если вы хотите, чтобы вызвать родительский метод, а затем декорировать результат с большим количеством информации, прежде чем он вернулся, вы можете сделать это, как это с чистым CoffeeScript:

class Parent 
    defaults:() -> 
    return { 
     tension: 0.8 
    } 

class Sub extends Parent 
    defaults:() -> 
    r = super 
    r.fill = true 

    return r 

sub = new Sub 

sub.tension # 0.8 
sub.fill # true 

Используя библиотеку как http://underscorejs.org/, возможно, сделает его немного красивее, как вы могли бы сделать:

defaults:() -> 
    _.extend super, { 
     fill: true 
    } 
+1

Отлично! Сейчас я вижу полный смысл. Огромное спасибо. –

+0

Нет проблем, просто рад помочь! Хороший уик-энд :) – tomahaug

+1

Просто посмотрел твою правку. Не думайте, что 'return r' является необязательным в этом случае. Если вы оставите его, он вернет 'r.fill', я думаю. –

0

Синтаксис CoffeeScript для этих двух будет:

класс Родитель:

defaults:() -> 
    return { 
     tension: 0.8, 
     # etc ... 
    } 

подклассов:

defaults: ($super) -> 
    return Rickshaw.extend $super(), { 
     fill: true, 
     # etc... 
    } 

Обратите внимание, что это только один из многих способов, чтобы написать кода в CoffeeScript.

Кроме того, помните, что есть неявного возвращение в CoffeeScript, поэтому можно удалить return в обеих случаях, учитывая, что методы не содержат следующий кода.

+0

Спасибо. Однако я не верю, что это правильно. Это все еще использует 'extend' и' $ super', которые являются [функциями прототипа] (https://github.com/shutterstock/rickshaw/blob/master/src/js/Rickshaw.Class.js) –

+0

А, так что вы спрашивая такую ​​же модель в CoffeeScript, без библиотеки Рикши? – tomahaug

+1

Что это. Рикша [использует Prototype] (https://github.com/shutterstock/rickshaw/blob/master/src/js/Rickshaw.Class.js) для наследования классов, и я пытаюсь переключить его на CoffeeScript. Прояснит вопрос. –