Ошибка JavaScript: "не является конструктором"

Я использую backbone.js вместе с jquery и underscore.js

Вот некоторые из моего кода (он пока ничего не делает). Странная вещь заключается в том, что при попадании URL-адреса "/# 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>

Ответ 1

new может использоваться только с функцией в качестве операнда.

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

Проверьте тип Users в контексте: это не функция, когда это исключение поднято.

Счастливое кодирование


alert(typeof(Users)) должен сделать трюк. Результат должен быть "функцией", которую можно использовать в качестве конструктора. Обратите внимание на то, что находится в неудачном случае, и см. Ниже по какой-либо причине.

Одним из проблемных сценариев (для Users = new Users) может быть: объект строится из функции Users, а затем объект (теперь это не функция/конструктор) присваивается обратно Users, поэтому следующий new Users будет kaboom! (Посмотрите как на showusers, так и на dashboard - это то, что действительно предназначено?)

Вероятно, правильный код: var users = new Users; users.blahblah(...); то есть использовать новую локальную переменную и не перезаписывать глобальную переменную/свойство Users.


Причина, по которой ошибка генерируется только тогда, когда "возврат" к "#foobar" (Идентификатор фрагмента) заключается в том, что никакая новая страница не является и, следовательно, JavaScript не перезагружается и используется текущий (теперь поврежденный Users). Kaboom!

Выдержка из Идентификатор фрагмента:

Если целевой элемент находится в текущем документе, пользовательский агент может просто сфокусировать целевой элемент, не перезагружая его...

Ответ 2

Я думаю, что его Синтаксическая ошибка

это случилось со мной, когда я попытался return anonymous object в моей функции

 var FalsEextension=false;
 ........
 ........
 return new  { FalsEextension, LargeFile };// wrong Syntax 

и правильный синтаксис

 return { FalsEextension, LargeFile };

и вы можете использовать его следующим образом

ObjectName.FalsEextension