为什么这个coffeescript会因以下错误而爆炸

时间:2014-02-03 22:39:05

标签: coffeescript

Person = (name, age, job) ->
  @name = name
  @age = age
  @job = job
  @sayName = ->
    console.log(@name)

kim = new Person("Kimothy Lozado", 37, "Skip Tracer")


console.log kim.sayName()

返回错误

TypeError: Object function () {
      return console.log(this.name);
    } has no method 'sayName'
  at Object.<anonymous> (/Users/aero/Downloads/m.coffee:11:17)
  at Object.<anonymous> (/Users/aero/Downloads/m.coffee:1:1)
  at Module._compile (module.js:456:26)

2 个答案:

答案 0 :(得分:2)

你没有很好地定义课程。也就是说,你需要一个构造函数,并且需要使用:而不是= s,这与普通的js不同。

请改为:

class Person
  constructor: (@name, @age, @job) ->

  sayName: ->
    console.log(@name)

kim = new Person("Kimothy Lozado", 37, "Skip Tracer")


console.log kim.sayName()

小提琴演示:http://jsfiddle.net/4e8xZ/

这是CoffeeScript小书中关于CoffeeScript类的一个很棒的article供您参考。

答案 1 :(得分:1)

我建议使用agconti来创建类,但在这里我想回答为什么会出现这个错误。

在javascript中编写构造函数时:

function Person(name) {
  this.name = name;
}

var someone = new Person('someone');

变量someone已分配给new keyword的返回对象。

但是如果构造函数返回一个函数:

function Person(name) {
  this.name = name;
  return function(){};
}

var someone = new Person('someone');

不幸的是,不是获取新创建的对象,而是将someone分配给构造函数返回的函数。

如果我们查看您的咖啡的编译代码:

Person = function(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  return this.sayName = function() {
    return console.log(this.name);
  };
};

我们看到构造函数返回一个函数。发生这种情况是因为 coffescript总是返回函数的最后一个表达式

您可以通过不返回任何内容来修复它:

Person = (name, age, job) ->
  @name = name
  @age = age
  @job = job
  @sayName = ->
    console.log(@name)
  return