В целом нужно было создать свой bind, который будет иметь тот же функционал, что и встроенный bind (нельзя использовать call, apply). Вот как это сделал я:
Function.prototype._bind = function(ctx, ...args) {
ctx.__temp__ = this;
return (function() {
return ctx.__temp__(...args);
});
}
let obj = {
name: 'ban'
};
function getname() {
return this.name;
}
let fnc = getname._bind(obj);
console.log(fnc());
Создание нового свойства у контекста - вообще не вариант, так вот вопрос можно ли сделать это лучше (без нового свойства контекста).
Создание нового свойства у контекста - вообще не вариант, так вот вопрос можно ли сделать это лучше (без нового свойства контекста).
можно ли сделать это без нового свойства контекста
Да, можно - используйте Symbol() вместо ключа.
let obj = {
a: 'A', b: 'B'
}
q: {
let key = Symbol()
obj[key] = 'q 1'
}
q: {
let key = Symbol()
obj[key] = 'q 2'
}
q: {
obj[Symbol()] = 'q 3'
obj[Symbol()] = 'q 4'
}
let objKeys = Object.keys(obj)
let objSymbols = Object.getOwnPropertySymbols(obj)
let objSymbolsValues = objSymbols.map(key => obj[key])
/**
obj {"a":"A","b":"B"}
objKeys ["a","b"]
objSymbols массив символом, смотри в консоле
objSymbolsValues ["q 1","q 2","q 3","q 4"]
*/
document.body.innerHTML = `
<pre>
obj ${JSON.stringify(obj)}
objKeys ${JSON.stringify(objKeys)}
objSymbols массив символом, смотри в консоле
objSymbolsValues ${JSON.stringify(objSymbolsValues)}
</pre>
`
MDN Symbol
Символ (анг. Symbol) — это уникальный и неизменяемый тип данных, который может быть использован как идентификатор для свойств объектов.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей