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)
答案 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来创建类,但在这里我想回答为什么会出现这个错误。
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