backbone.js - “new”关键字后需要括号?

时间:2013-10-26 06:17:57

标签: javascript backbone.js backbone-routing

我一直在使用codeschool.com的backbone.js教程 并提交:

var AppRouter = new Backbone.Router.extend({
  //code
});
$(function(){ AppRouter.start() });

并且它给出了以下错误消息:

TypeError: 'undefined' is not a function (evaluating 'AppRouter.start()') :28 :14

但添加单个括号解决了问题

var AppRouter = new (Backbone.Router.extend({
  //code
}));

我觉得它之前应该还有用......当没有一个括号时发生了什么?

2 个答案:

答案 0 :(得分:3)

它使用Backbone.Router.extend作为构造函数(括号作为构造函数的参数,而不是Backbone.Router.extend调用的结果(调用Backbone.Router.extend的函数返回一个函数)用作构造函数)。例如,比较:

function Test()
{   return function () { this.a = 2; };
}

console.log(new Test()); // function () { this.a = 2; }
console.log(new (Test())); // { a: 2 }

答案 1 :(得分:1)

回答另一种方式,您需要使用Backbone.Router实例,您可以先使用自己的路由器进行扩展。如:

var AppRouter = Backbone.Router.extend({
    routes: {
        // code
    }
});

var router = new AppRouter();
Backbone.history.start();

示例中的代码首先评估extend调用,然后创建一个带有返回值的实例。最终结果是相同的,但如果您不知道括号导致评估发生,可能会有点误导。