在javascript中使用构造函数的对象

时间:2015-08-09 19:09:42

标签: javascript node.js browserify

好吧我有一个问题,我不知道答案。我正在创建一个对象,该对象的属性是构造函数。现在在这些构造函数中我引用了这个。这个变量是否会引用父对象,所以如果我在每个构造函数中创建this.submit,它是否会覆盖先前的定义?

我这样做的原因是因为我循环遍历对象中的每个属性,如果它是一个函数,那么我使用Node的Event Emitter扩展其原型,这样我就可以在成功调用ajax之后调度事件。

以下是一个例子:

var AccountMethods = function(apiVersion){

    return {
        /** Used to login users
         *
         * @param username - {string} Username
         * @param password - {string} Password
         * @function
         *
         * @example
         * var Login = new Easy.Login('fakeusername', 'fakepassword')
         * Login
         *     .on('done', function(data){
         *         if(data.success){
         *              // user is logged in
         *         } else{
         *             throw new Error(data.error);
         *         }
         *     })
         *     .on('error', function(err){
         *         // do something with err
         *     });
         */
        Login: function (username, password) {
            this.submit = function () {
                $.post(apiVersion + 'account/login', {
                    username: username,
                    password: password
                })
                    .done(function (data) {
                        if(data.success){
                            this.emit('done', data);
                        } else{
                            this.emit('error', data)
                        }
                    }.bind(this))
                    .fail(function (err) {
                        this.emit('error', {
                            error: err.status + ' ' + err.statusText + ' : ' + err.responseText
                        });
                    }.bind(this));
            }
        },
        /** Used to logout users
         *
         * @function
         *
         * @example
         * var Logout = new Easy.Logout();
         *
         * Logout.on('done', function(){
         *     // user is logged out
         * });
         *
         * Logout.submit();
         */
        Logout: function () {
            this.submit = function () {
                $.post(apiVersion + 'account/logout')
                    .done(function (data) {
                        this.emit('done');
                    }.bind(this))
                    .fail(function (err) {
                        this.emit('error', err);
                    }.bind(this));
            }
        },
    }
}

您可以在评论示例中看到用法。这肯定按照我想要的方式工作,但是不是吗?

我可以这样做,它按预期工作:

var Login = new Easy.Login('fakeusername', 'fakepassword');
Login.submit();

var Logout = new Easy.Logout();
Logout.submit();

两个提交函数都使用this.submit = ...在同一个父对象中设置,但它按预期工作。有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:2)

当您使用new调用构造函数时,一个新的空对象被绑定到this,因此函数this内部将引用新的正在创建的对象(即从new Link()调用返回的内容。)这意味着在您的示例中,变量LoginLogout是不同的对象,具有不同的提交方法。 / p>

如果有人尝试在没有Login的情况下拨打new,则this的值将取决于调用上下文:如果调用Easy.Login,则this会引用Easy,但如果直接调用函数引用,那么this的值将取决于您是否启用了严格模式。 (见Matt Browne的评论

总而言之:只要您只将它们用作构造函数,这种方法是正确的。但正如你所看到的那样,没有调用构造函数,因为它们被设计为被调用可能是有问题的,因此构造函数的惯例是'名称以大写字母开头(你正确地遵循),所以人们不会错误地在没有new的情况下调用它们(大多数静态代码分析器会默认警告你不遵守这个惯例。)