2

私は毎秒何千回も呼び出されるかもしれない関数を持つライブラリを作成しています。そのような固定プロトタイプに新しいデータセットを結合するように、この関数はnewコンストラクタが必要です。'バインディング' Javascriptの関数に 'new'コンストラクタを追加

var internalFunc = function(a) { 
    this.foo = a; 
}; 
internalFunc.prototype = { 
    something: 'some value', 
    anotherIndex: 'another value', 
    /* ... */ 
}; 

だから、私は現在internalFuncnewコンストラクタと呼ばれるようになっています方法は、第二を使用することです誰かが 'コンストラクタプロキシ'と呼べるもののような機能の並べ替え。

var funcThatGetsUsed = function(someArgument){ 
    return new internalFunc(someArgument); 
}; 

しかし、バックの主な問題になって、このfuncThatGetsUsedは何千回も二と呼ばれる得ることができます。したがって、ライブラリのサイズを減らすことができます。そして、私がその中間者の 'コンストラクタプロキシ'関数を削除して新しいコンストラクタをinternalFuncにバインドすることができれば、コードの速度を向上させることができますそのようなbind機能に:だから

var funcThatGetsUsed = internalFunc.bindToConstructor('new'); 

、関数呼び出しのオーバーヘッドを減らすためにJavaScriptで「bindToConstructor」する方法はありますか?

なぜ私はライブラリのユーザにこの新しい演算子を使用するように伝えることができないのは、この特定のライブラリの目的を無効にするためです。ケースとポイント:JQueryは「コンストラクタプロキシ」機能を使用します。ただ、console.log($.toString())のようなものに入力して、あなたはこのようなものが表示されます。

> console.log("'" + $.tostring() + "'") 

'function (a,b){return new n.fn.init(a,b)}' 

は、ソリューションがInternet Explorerで動作する必要はありませんので、私は、上記のエッジをターゲットにしていますのでご注意ください。 「ターゲットエッジ」とは、Edgeで動作する場合、他のすべてのブラウザで動作することです。

+1

を使用することができ、あなたは、オブジェクト毎秒数千人をインスタンス化を心配する必要があります。 – Bergi

+2

あなたが探していることを行うだろう 'internalFunc :: new'のための[オペレータ提案の考え方](https://github.com/tc39/proposal-bind-operator/issues/25)がありました。しかし、No. – Bergi

+0

@Bergi **の**全体の質問をお読みください。私は現在何をしているのですが、より効率的な方法があれば私は好奇心が強いです。また、これは私が書いている図書館のためのものです。図書館の作家としての私の目標は、それを1秒間に数千回呼び出すことによってそれを悪用する人々のためにできるだけ効率的に図書館を作ることです。 –

答えて

1

あなたが代わりに余分な関数呼び出しを心配するの、ところでReflect.construct()

var funcThatGetsUsed = Reflect.contruct(internalFunc /* , [args] */) 
+1

これは何も結び付けていないので、 'new'演算子を置き換えます(そして、引数を配列として渡す必要があります) – Bergi

+1

これはまさに私が探していたものでした!どうもありがとうございます!私はあなたが私にできるようにすぐに受け入れあなたの答えをマークします! –

+2

@BergiあなたはOPが何かをバインドしようとしていると読んでいますか? – guest271314

関連する問題