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);

но "this" относится к окну, и я не знаю, как его изменить.

Моя скрипка

Ответ 1

Вы не можете. Это невозможно. this в функциях стрелок лексически охвачены, что их выдающаяся особенность. Но вам нужна динамически связанная this, и что для function полезно.

Если вы настаиваете на использовании новых функций 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);