В JavaScript ecma6 изменения нормальной функции стрелка
У меня есть такой код:
function defineProperty(object, name, callback){
if(object.prototype){
Object.defineProperty(object.prototype, name, {"get": callback});
}
}
defineProperty(String, "isEmpty", function(){return this.length === 0;});
И я использую его, как показано ниже:
console.log("".isEmpty, "abc".isEmpty);
И возвращает:
true, false
Теперь я хотел бы изменить функцию на что-то вроде этого:
defineProperty(String, "isEmptyWithArrow", () => this.length === 0);
Но "это" относится к окну, и я не знаю, как его изменить.
1 ответ:
Вы не можете. Это невозможно.
this
в функции arrow лексически ограничен, это их выдающаяся особенность. Но вам нужен динамически связанныйthis
, и это то, для чего хорошиfunction
s.Если вы настаиваете на использовании необычных новых функций ES6, перейдите к определению метода:
function defineProperty(object, name, descriptor) { if (object.prototype) Object.defineProperty(object.prototype, name, descriptor); } defineProperty(String, "isEmpty", {get(){return this.length === 0;}, configurable:true});
Конечно, вы также можете принять обратный вызов, который получает экземпляр в качестве аргумента:
function defineProperty(object, name, callback) { if (object.prototype) Object.defineProperty(object.prototype, name, { get(){ return callback(this); }, // dynamic this configurable: true }); } defineProperty(String, "isEmpty", self => self.length === 0);