调用函数时如何自动绑定“ this”?

时间:2018-10-12 06:53:37

标签: javascript

我的示例代码:

    var Person = (function () {
        var __sym = Symbol('Person');

        class Person {
            constructor(name) {
                this[__sym] = { name: name };
            }
            getName() {
                let _this = this[__sym];

                return _this.name;
            }
        }

        return Person;
    }());

    var person = new Person('Hermione');

    console.log(person.name); // undefined
    console.log(person.getName()); // Hermione

在此示例中,我将使用__sym作为分配给私有数据的键。

我的问题是:如何将this[__sym]绑定到Person类中的每个方法?

我的真实项目:

let Chatwindow = (function () {
    let __sym = Symbol('Chatwindow');

    let __data = {};

    // for typo
    let __prop = {
        targetUserId: 'targetUserId'
    };

    __data.init = function (...args) {
        let _this = this[__sym];

        let options = args[0];

        // validating the type of 'options' and the properties...

        // just get what I need
        _this[__prop.targetUserId] = options[__prop.targetUserId];

        (async () => {
            let messages = await __data.getMessagesAsync.call(_this);

            // my goal:
            // let messages = await __data.getMessagesAsync();
        })();
    };
    __data.getMessagesAsync = function () {
        let _this = this;

        let promise = new Promise(function (done) {
            // create model before sending
            let model = { [__prop.targetUserId]: _this[__prop.targetUserId] };

            // sending...

            done();
        });

        return promise;
    };

    class Chatwindow {
        constructor() {
            this[__sym] = {};
        }
        set init(value) {
            return __data.init;
        }
        get init() {
            return (...args) => __data.init.call(this, ...args);
        }
    }

    return Chatwindow;
}());

每次调用一个方法时,我都必须使用call(_this)函数来绑定键,如下所示:

let messages = await __data.getMessagesAsync.call(_this);

然后,在getMessagesAsync方法中,我可以使用this属性将其分配给私有数据。

我要实现的目标:我想一次将所有方法绑定在init方法内。我该怎么办?

类似这样的东西:

__data.getMessagesAsync.oncall = function () {
    // bind this with this[__sym]
};

然后

__data.getMessagesAsync(); // no need to pass anymore

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用箭头函数,因此可以确保每次上下文(此)都是相同的(无论从何处调用箭头函数,这都指向父级)

__data.getMessagesAsync = () => {
    let promise = new Promise((done) => {
        // create model before sending
        let model = { [__prop.targetUserId]: this[__prop.targetUserId] };

        // sending...

        done();
    });

    return promise;
}

答案 1 :(得分:0)

在javascript中,使用function_name.bind(o)可以创建一个新函数,其上下文this绑定到对象o

您要创建一个新功能:

__data.boundMessagesFunction = __data.getMessagesAsync.bind(_this);

现在您可以致电:

let messages = await __data.boundMessagesFunction();