我的示例代码:
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
谢谢!
答案 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();