В 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 4

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