2015-07-06 5 views
2

Я использую библиотеку, которая имеет класс, определенный как это:Переопределение функции JavaScript с помощью CoffeeScript

RoundDown = function() { 
    this.prop = 5.5 
    this.do_something = function() { 
     return "base class: " + this.prop 
    }; 
}; 

Использование CoffeeScript, я хочу продлить do_something поэтому он будет работать свою первоначальную функцию плюс новый код. Подклассификация кажется чистым решением, но функция базового класса вызывается, а не переопределенная функция.

# Subclass overriding round function 
class RoundUp extends RoundDown 
    do_something:() -> 
     return super() + " Subclass code" 

jsFiddle here.

Каков правильный способ? Благодаря!

+1

Первый пример технически не является «классом», как понимает кофе. Вам нужно добавить методы на прототипе, об этом знает 'extends'. Теперь вы добавляете метод как собственное свойство. – elclanrs

+0

@elclanrs Это тоже не «класс», как понимают многие разработчики JavaScript :) –

+0

Спасибо за скрипку, это было очень полезно. –

ответ

2

Проблема заключается в том, что RoundDown устанавливает поле экземпляра, а не прототипа. Идеальный способ исправить это будет

RoundDown = function() { 
    this.prop = 5.5 
}; 
RoundDown.prototype.do_something = function() { 
    return "base class: " + this.prop 
}; 

Но, может быть, у вас нет разрешения на изменение ROUNDDOWN, например, она в библиотеке, так что это

class RoundUp extends RoundDown 
    constructor: -> 
    super() 
    oldDoSomething = @do_something 
    @do_something = -> 
     oldDoSomething.call(this) + " Subclass code" 
+0

Правильно, у меня нет разрешения на изменение библиотеки. (Ну, я технически делаю, но для ремонтопригодности, я не хочу) Это кажется близким, но подкласс не имеет доступа к свойствам базового класса. – Wehrdo

+0

Для уточнения, если вы поместите код в jsFiddle, вы увидите, что он печатает «базовый класс: неопределенный код подкласса». Когда базовый класс пытается получить доступ к «this.prop», он возвращается как неопределенный. – Wehrdo

+0

@Wehrdo fixed; отсутствовала функция :: call, поэтому 'this' был неправильным –

0

Использование конвертера js2coffee: js2.coffee:

RoundDown = -> 
    @prop = 5.5 

    @do_something = -> 
    'base class: ' + @prop 
Смежные вопросы