A Backbone model’s property has to be accessed with the get(property) method.

var myObj = Backbone.Model.extend({ ... });
//don't do this
console.log(myObj.myProp);

//do this instead
console.log(myObj.get('myProp'));

If you’re trying to pass this object to a Handlebars.js, things start to get messy. If you’ve got a template like this

var myTemplate = Handlebars.compile("Property: ");
console.log(myTemplate(myObj));

Handlebars won’t find the property, and nothing will be displayed. There’s a well-known workaround to this though, which is to convert the Backbone Model into JSON

console.log(myTemplate(myObj.toJSON()));

However this isn’t as readable as I’d prefer. If your collection gets really big, it can make your application slow, and in situations where you’ve got a Backbone Collection of Models, it doesn’t even work. A. Matias Quezada has a better solution, which is to tell Handlebars, “hey, if it’s a Model, use the get method”:

Handlebars.JavaScriptCompiler.prototype.nameLookup = function (
  parent,
  name,
  type
) {
  var result =
    "(" +
    parent +
    " instanceof Backbone.Model ? " +
    parent +
    '.get("' +
    name +
    '") : ' +
    parent;
  if (/^[0-9]+$/.test(name)) {
    return result + "[" + name + "])";
  } else if (
    Handlebars.JavaScriptCompiler.isValidJavaScriptVariableName(name)
  ) {
    return result + "." + name + ")";
  } else {
    return result + "['" + name + "'])";
  }
};

That’s it. If you run that somewhere before your Template runs, Handlebars will be able to find the Backbone Model’s property.

In writing this post, I also came across Thorax.js, which probably also fixes this problem.