7

私はそのコードを持っています:

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

しかし、「これ」はウィンドウを指しており、変更方法がわかりません。

私のフィドル

4

1 に答える 1

9

それはいけません。これは不可能です。thisin アロー関数はレキシカル スコープであり、それが優れた機能です。しかし、動的にバインドされたが必要thisであり、それがfunctions の良いところです。

派手な新しい 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);
于 2015-08-12T21:44:09.727 に答える