2012-07-04 2 views
4

Вот пример того, что я пытаюсь сделать.Ошибка прототипа CoffeeScript

User = (name,dob,rank,score) -> 
    { 
     name: name 
     dob: dob 
     details: { 
      rank: rank 
      score:score 
     } 

     basicInfo: -> return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
     detailedInfo: -> return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 
    } 

User::displayName = -> 
    console.log @name 

bob = new User("Bob","10/12/69",1,100000) 

bob.displayName() 

Я получаю сообщение об ошибке: «Uncaught TypeError: Объект # не имеет какого-либо метода" DISPLAYNAME»

Не совсем уверен, почему я получаю эту ошибку. Любая помощь приветствуется.

+0

Я не очень хорошо разбираюсь в CFS, но это не так, как вы объявляете классы в нем. Смотрите: http://coffeescript.org/#classes – Zirak

ответ

4

Когда вы вернуть новый объект из конструктора, он не разделяет прототип. Надлежащий конструктор добавляет свойства/методы this:

User = (name,dob,rank,score) -> 
    @name = name 
    @dob = dob 
    @details = 
    rank: rank 
    score: score 
    @basicInfo = -> return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
    @detailedInfo = -> return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 

Вы можете воспользоваться class абстракции CoffeeScript, который просто генерирует стандартные функции конструктора:

class User 
    constructor: (name, dob, rank, score) -> 
    @name = name 
    @dob = dob 
    @details: 
     rank: rank 
     score: score 
    basicInfo: -> 
    return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
    detailedInfo: -> 
    return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 

Это функционально то же самое, что и выше, за исключением того, что basicInfo и detailedInfo здесь уже находятся в prototype, где они должны быть. При этом User::displayName = -> console.log @name должен работать нормально.

http://coffeescript.org/#classes См

4

Вы пытаетесь скопировать javascript в coffeescript. Плохо. (Путем смешивания статических методов и методов прототипа.)

В CoffeeScript вы можете использовать ключевое слово class, чтобы делать то, что вы хотите.

class User 
    constructor: (@name, @dob) -> 

    displayName: -> 
     console.log @name 

bob = new User "Bob", "10/12/69" 

bob.displayName() // "Bob" 

Дополнительная информация: http://coffeescript.org/#classes

+0

вам обычно нужно узнать * больше * о javascript, чтобы правильно использовать coffeescript. Этот вопрос не имеет ничего общего с CS vs JS, но непонимание того, как работают функции конструктора. –

+0

Справедливо, так зачем использовать этот синтаксис «User :: displayName ->» – rai

+0

Это сработает, если бы вы использовали ключевое слово 'class' :-) –

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