2016-07-02 3 views
1

バインドを使用せずにどのクラスにいるのかを知る必要がある場合、この場合の横方向の解決策。バインド以外の約束の文脈解決のための他のソリューション

function Customer() {} 
Customer.prototype.say = function() { 
    console.log("I'm " + this.constructor.TYPE); 
}; 
Customer.TYPE = 'customer'; 

function Product() {} 
Product.prototype.say = function() { 
    console.log("I'm " + this.constructor.TYPE); 
}; 
Product.TYPE = 'product'; 

var customer = new Customer(); 
var product = new Product(); 

//cleaner interface 
Promise.resolve() 
    .then(customer.say) //I'm undefined 
    .then(product.say) //I'm undefined 


//works but looking for a solution using cleaner interface like above 
//any lateral thinking 
Promise.resolve() 
    .then(customer.say.bind(customer)) //I'm customer 
    .then(product.say.bind(product)) //I'm product 

私は非バインドベースのソリューション、横向きの思考に基づいたアイデアをお探しですか?

私はSDKを開発していますので、よりクリーンなインターフェイスを提供し、クライアントに使用したいと考えています。

+0

あなたは 'bind' aまたは無名関数のどちらかを使用しなければなりません。あなたが期待しているものが何であるかわかりません... – elclanrs

+0

より洗練された構文を維持しながら呼び出し元の型を知る方法はありますか? – user2727195

+0

* "グローバルスコープで呼び出されました" *いいえ、スコープとは関係のないグローバルオブジェクト(厳密モードでは 'undefined')を参照する' this'で呼び出されます。 –

答えて

1

あなたは基本的に3つのオプションがあります。

  1. bind、あなたはしたくないと述べました。このような

  2. ラッパー関数:

    .then(function(r) { return customer.say(r); }) 
    

    ... ES2015に次のようになります。

    .then(r => customer.say(r)) 
    
  3. 変更あなたのオブジェクトを、彼らはもはやから継承された機能を使用しないようにプロトタイプではなく、インスタンスに近いインスタンス固有の関数です。

    var Customer = function() { 
        var me = this; 
        me.say = function() { 
         console.log("I'm " + me.constructor.TYPE); 
        }; 
    }; 
    

    var Customer = function() { 
        this.say =() = { 
         console.log("I'm " + this.constructor.TYPE); 
        }; 
    }; 
    

    + ES2015であなたはより多くの機能を作成し終わるそのようにオブジェクトが、関数内のコードは、JavaScriptエンジンによって再利用されます。

ありproposal to the TC39 committee that defines JavaScriptは(基本的にbindしかし、クリーナーの構文で)何をしたいんオペレーターのためだが、それはステージ0でのみですので、ES2017になることはほとんどありません。

+0

あなたが言うと、より多くの関数オブジェクトをそのように作成することになります。つまり、各オブジェクトには 'say'のコピーがありますか? – user2727195

+0

@ user2727195:各 'Customer'オブジェクトはそれ自身の' say'関数オブジェクトを取得します。現代のJavaScriptエンジンでは、その関数オブジェクトは、他の 'Customer'インスタンスにある' say'関数オブジェクトとunderylingコードを共有しますが、それはインスタンスごとです。これは何十万もの 'Customer'オブジェクトが同時に存在する場合にのみ問題になります。 –

+0

洞察のおかげで、私の答えを確認してください – user2727195

0

いくつかの考え:

1)プロトタイプ/クラスを使用しないでください。彼らはそのような問題を何度も繰り返すでしょう。代わりに、モジュールパターンを使用します。 「方法」が閉鎖毎回内に作成されているので、それらが効果的に拘束されています

function Customer() { 
    function say() {} 

    return { 
     type: 'product', 
     say 
    } 
} 

2)は、すべてのメソッドは、事前にバインドされたオブジェクトのプロトタイプベースの階層構造を構築するための構造を提供します。これはプロトタイプの唯一の利点を取り除くことに注意してください。

3)冒険うと::表記はバベルで利用できるように使用:すべてのものより良い確か):: customer.say(当時 を、その命題は、現時点では少し古くなっているので、それはないかもしれません正式に言語を入力することさえできます。

+0

あなたの答えちょっと私の答えを投稿する助け:) – user2727195

+0

問題はありません:) – AlexG

+0

あなたのリターンステートメントが不完全で、エラーがあると思います。 – user2727195

関連する問題