JavaScript错误:“不是构造函数”

时间:2011-04-13 20:42:49

标签: javascript jquery debugging backbone.js underscore.js

我正在使用backbone.js以及jquery和underscore.js

这是我的一些代码(它还没有做任何事情)。奇怪的是,在点击网址“/#users”时没有错误。错误发生的唯一时间是我然后单击以转到其他哈希,然后单击返回以转到“/#users”。这是我的代码的一部分,在最后收到错误的行Users = new Users();错误显示“用户不是构造函数”:

var User = Backbone.Model.extend({
    url: function(){return 'api/user/id/' + this.id;}
});

var Users = Backbone.Collection.extend({
    model: User,
    url: function(){return 'api/users';},
    initialize: function() {
    }
});

var UsersView = Backbone.View.extend({
    initialize: function() {
        this.users = this.options.users;
        this.render();
    },

    render: function() {
        _(this.users).each(function(){
        //  $('#app').append('here');
        });

        var template = _.template($('#usersTemplate').text());

        $(this.el).html(template({users: this.users}));
        $('#app').html(this.el);
    }
});

var UserView = Backbone.View.extend({
    initialize: function() {
        this.user = this.options.user;
        this.render();
    },

    render: function() {

        var template = _.template("hello {{user.name}}");

        $(this.el).html(template({user: this.user.toJSON()}));
        $('#app').html(this.el);
    }
});

var Controller = Backbone.Controller.extend({
    routes: {
        'dashboard' : 'dashboard',
        'users' : 'showusers'
    },

    showuser: function(id) {
        UserList.fetch({
            success: function(){
                new UserView({user: User});
            },
            error: function(){
                alert('an error of sorts');
            }
        });
    },

    showusers: function() {
        Users = new Users();
        Users.fetch({
            success: function(Users) {
                new UsersView({users: Users});
            },
            error: function() {
            }
        });
    },

    dashboard: function() {
        Users = new Users;
        Users.fetch({
            success: function() {
                new UsersView({users: Users});
            },
            error: function() {
            }
        });
    }
});

$(document).ready(function(){
    var ApplicationController = new Controller;
    Backbone.history.start();
});

随附的html,如果你很好奇:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Administration Panel</title>

    <!-- Framework -->
    <script src="/javascripts/jquery.min.js"></script>
    <script src="/javascripts/underscore.min.js"></script>
    <script src="/javascripts/backbone.js"></script>

    <!-- Application -->
    <script src="/javascripts/application.js"></script>

    <script id="usersTemplate" type="text/x-underscore-template">
        asdf
    </script>

</head>
<body>

<div>
<a href="#dashboard">Dashboard</a>
<a href="#users">Users</a>
<a href="#products">Products</a>
<a href="#orders">Orders</a>
<a href="#pages">Pages</a>
<a href="#settings">Settings</a>
</div>

<div id="app"></div>

</body>
</html>

2 个答案:

答案 0 :(得分:23)

new只能与Function一起用作操作数。

new {}  // Error: ({}) is not a constructor

在上下文中检查Users的类型:当引发该异常时,它一个函数。

快乐编码


alert(typeof(Users))应该做的伎俩。结果应该是“function”以用作构造函数。记下失败案例中的内容,并在下面查看原因。

一个有问题的场景(对于Users = new Users)可能是:对象是从Function Users构造的,然后对象(现在不是Function / constructor)被分配回Users所以下一个new Users会去 kaboom!(同时查看showusersdashboard - 真的的行为是什么?)

'正确'代码可能是:var users = new Users; users.blahblah(...);也就是说,使用新的局部变量并且不会覆盖全局用户变量/属性。


仅在“返回”到“#foobar”(一个Fragment Identifier)时生成错误的原因是没有实际加载新页面,因此JavaScript没有重新加载和当前(现在已损坏{正在使用{1}})。的 KABOOM!

摘自Fragment Identifier

  
    

如果目标元素位于当前文档中,则用户代理可以只关注目标元素而无需重新加载...

  

答案 1 :(得分:0)

我认为它的语法错误

当我在我的功能

中尝试return anonymous object时,发生了这种情况
 var FalsEextension=false;
 ........
 ........
 return new  { FalsEextension, LargeFile };// wrong Syntax 

,正确的语法是

 return { FalsEextension, LargeFile };

你可以像这样使用它

ObjectName.FalsEextension