javascript 中具有构造函数的对象

Object with constructors in javascript

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

我这样做的原因是因为我循环遍历对象中的每个 属性,如果它是一个函数,那么我将使用 Node 的事件发射器扩展它的原型,这样我就可以在成功后调度事件 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 = ... 在同一个父对象中设置,但它按预期工作。有人可以给我解释一下吗?

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

如果有人尝试在没有 new 的情况下调用 Login,那么 this 的值将取决于调用上下文:如果调用为 Easy.Login,则 [=11] =] 将引用 Easy,但如果直接作为函数引用调用,则 this 的值将取决于您是否启用了严格模式。 (请参阅下面 Matt Browne 的评论

总而言之:只要您仅将它们用作构造函数,这种方法就是正确的。但是正如您所见,不按设计调用构造函数的方式调用它们可能会出现问题,因此构造函数的名称以大写字母开头的约定(您正确遵循),所以人们不会错误地在没有 new 的情况下调用它们(大多数静态代码分析器默认情况下会警告您不遵循此约定)。