javascript - 更改自己对象中函数内对象的属性

标签 javascript object properties scope this

我创建一个对象并为其设置一些函数,我的问题是,我可以在附加到它的函数中更改该对象的属性值吗?

这是我的代码:

    var service = new Object();
    service.login = login;
    service.isUserAuthenticated = false;

    function login(userName, password, successCallback) {
        var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
        $http.post($rootScope.baseUrl + 'token', requestBody)
            .then(
            function (response) {
                isUserAuthenticated = true;
                successCallback(response);
            },
            function (response) {
                console.log(response);
            })
    }

我想在用户登录系统时更改 isUserAuthenticated 的值,这可以在这个登录函数中实现吗?

如有任何帮助,我们将不胜感激。

最佳答案

当您将login绑定(bind)到service时,this(如果在login的正文中使用> 函数)将在login执行期间引用service对象。但是,在 login 函数内定义并作为参数传递给 .then() 的后续回调中,this 将不再引用该服务一旦执行回调,您就需要将服务绑定(bind)为 (this) 上下文,或者将其存储在闭包中。因此,您可以重写您的login函数:

// binding 'this' to the service
function login(userName, password, successCallback) {
    var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
    $http.post($rootScope.baseUrl + 'token', requestBody)
        .then(function (response) {
            this.isUserAuthenticated = true;
            successCallback(response);
        }.bind(this),
        function (response) {
            console.log(response);
        });
}

否则:

// storing the service as a closure
function login(userName, password, successCallback) {
    var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
    var self = this;
    $http.post($rootScope.baseUrl + 'token', requestBody)
        .then(
        function (response) {
            self.isUserAuthenticated = true;
            successCallback(response);
        },
        function (response) {
            console.log(response);
        });
}

就您而言,后者并不是绝对必要的,因为您已经将服务存储为在 login 函数外部声明的变量,并且可以简单地分配 true service.isAuthenticated

此外,如果您使用 ES6,函数文字(即 function() {//... })将作为回调传递给 .then() 可以使用粗箭头表示法编写,上下文绑定(bind)将自动执行:

function login(userName, password, successCallback) {
    var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
    $http.post($rootScope.baseUrl + 'token', requestBody)
    .then((response) => {
        this.isUserAuthenticated = true;
        successCallback(response);
    },
    (response) => {
        console.log(response);
    });
}

关于javascript - 更改自己对象中函数内对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354508/

相关文章:

c++ - "sizeof"一个类或对象可以为零吗?

ios - 对象类型 "id"的属性

javascript - 在 Javascript 中添加和减去字符串和数字 - 自动类型转换?

javascript - 使用 AngularJs 进行 Google+ 登录

c++ - 在 C++ 中使用 THIS 指针将对象写入文件

javascript - 在 js 中复制对象(需要文档中的引用传递指导)

php - 在 PHP 中从具有动态类名的类中获取静态属性

vb.net - VB 模块中的公共(public)属性 - 跨客户端行为

javascript - PhoneGap : Make phone call within application

javascript - <button onclick=...> 和 <a href ="#"onclick=.../> 有什么区别