Sean Allred
Sean Allred

Reputation: 3658

Variable not being set with return value

class Person
  constructor: (@name, @org, @phone, @email) ->
    alert "#{name}: #{org} #{phone} #{email}"

__create = (title) ->
  p =
    name: ""
    org: "_organization"
    phone: "_phone"
    email: "_email"

  (p[pr] = "%#{title}#{p[pr]}%" for pr of p)

  Person(p.name, p.org, p.phone, p.email)

m = __create "author"

alert m.name

This consistently gives me:

TypeError: Cannot read property 'name' of undefined

However, the compiled JavaScript clearly assigns m a value:

__create = function(title) {
  var p, pr;
  p = {
    name: "",
    org: "_organization",
    phone: "_phone",
    email: "_email"
  };
  for (pr in p) {
    p[pr] = "%" + title + p[pr] + "%";
  }
  return Person(p.name, p.org, p.phone, p.email);
};

m = __create("author");

alert(m.name);

What am I missing here?

Upvotes: 0

Views: 34

Answers (1)

Dave Newton
Dave Newton

Reputation: 160261

You need to use the new operator, e.g.,

__create = (title) ->
  p =
    name: ""
    org: "_organization"
    phone: "_phone"
    email: "_email"

  (p[pr] = "%#{title}#{p[pr]}%" for pr of p)

  new Person(p.name, p.org, p.phone, p.email)

http://coffeescript.org/#classes

Upvotes: 3

Related Questions