2013-11-08 2 views
2

Это работает:CoffeeScript статическое наследование дочерних классов

class Foo 
    class @_Bar 
    @narf = '' 
    @point : -> 
     @narf = 'what' 

    class @_Baz extends @_Bar 
    @point : -> 
     @narf = 'woo' 
     super() 

Это не

class Foo 
    class @_Bar 
    @narf = '' 
    @point = -> 
     @narf = 'what' 

    class @_Baz extends @_Bar 
    @point = -> 
     @narf = 'woo' 
     super() 

работает Foo._Baz.point() выбросит и ошибок.

Пожалуйста, объясните, что здесь происходит.

+0

В дополнение к сообщению об ошибке, создаваемом Тревором, https://github.com/jashkenas/coffee-script/issues/1598 является проблемой, которая добавила поддержку 'super' к статическим методам (около 2 лет назад). – hpaulj

+0

Участвуя там сейчас. Благодарю. – Fresheyeball

ответ

1

На github есть несколько исправлений. https://github.com/jashkenas/coffee-script/issues/3232

В настоящее время дерево узлов для метода @foo= отличается от метода @foo:. Из-за этого узел, созданный с помощью =, никогда не передается методу Class addParameters и никогда не помечен как static.

Одно решение, которое, вероятно, будет принято, гарантирует, что обе формы создают одно и то же дерево узлов.

Внесенный мной https://github.com/jashkenas/coffee-script/issues/3232#issuecomment-28316501 добавляет метод nodes.coffee class Class. Этот метод является урезанной версией addParameters и, в частности, проверяет дерево узлов =.

Если вам нужно исправить в собственном кофе компилятором, чтобы изменить файл src/coffee-script/nodes.coffee, скомпилировать его, и положил в результате node.js в каталоге lib (или используйте cake build).

+0

https://github.com/jashkenas/coffee-script/pull/3237/files - текущая модификация. Часть, включающая 'lookStatic', может быть добавлена ​​к 1.6.3' nodes.coffee'. Я не играл с частью, связанной с «METHOD_DEF», которая затрагивает другую проблему. – hpaulj

3

Кажется, что ошибка в компиляторе для меня. Запись

class X 
    @classMethod: -> 

и

class X 
    @classMethod = -> 

должны быть эквивалентны, но super компилируется по-разному по двум методам. В первом, он компилирует правильно:

X.__super__.constructor.classMethod.apply(this, arguments); 

Во втором, он компилирует, как если бы classMethod были метод экземпляра:

X.__super__.classMethod.apply(this, arguments); 
+0

Я подал сообщение об ошибке: https://github.com/jashkenas/coffee-script/issues/3232 –

+1

Действительно, вы думаете, что это ошибка? Я думал, что это было преднамеренно, и что я просто не понимал намерения. – Fresheyeball

2

Это работает:

class Foo 
    class @_Bar 
    @narf = '' 
    point : -> 
     @narf = 'what' 

    class @_Baz extends @_Bar 
    @point = -> 
     @narf = 'woo' 
     super() 

alert Foo._Baz.point() # 'what' 
alert new Foo._Bar().point() # 'what' 

То есть, составленный @point=super заканчивается, указывая на экземпляр point:. Его JS составляет: _Baz.__super__.point.call(this), что составляет _Bar.prototype.point.call(this). (extends определяет: child.__super__ = parent.prototype).

Как видно из прошлых изменений Coffeescript, @point: - это предполагаемый синтаксис для статических (класс) методов (и используется таким образом в самом компиляторе).

+0

Это не имеет никакого смысла. 'point: ->' прикрепляется как 'Foo.prototype.point', поэтому статический метод не получает к нему доступа. – Fresheyeball

+0

Попробуйте. Я указываю, что делает Coffeescript, а не я думаю, что он должен это делать. – hpaulj

+0

Фактически 'point: ->' прикрепляется как 'Foo._Bar.prototype.point'. – hpaulj

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