"Связывание" "нового" конструктора с функцией в Javascript

Я создаю библиотеку с функцией, которая может вызываться много тысяч раз в секунду. Эта функция требует new конструктор для привязки нового набора данных к фиксированному прототипу, например:

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

Итак, как я сейчас получаю internalFunc быть вызванным с new Конструктор - это использование второй функции, вроде той, которую можно назвать "прокси конструктора".

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

Однако, возвращаясь к основной проблеме, это funcThatGetsUsed можно вызывать много тысяч раз в секунду. Таким образом, это могло бы уменьшить размер библиотеки, и это могло бы увеличить скорость кода, если бы я смог исключить функцию посредника "proxy конструктора" и просто связать новый конструктор с internalFuncможет быть, аналогично bind функционировать так:

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

Итак, есть ли способbindToConstructorв JavaScript, чтобы уменьшить накладные расходы вызова функции?

Обратите внимание, что причина, по которой я не могу просто сказать пользователю библиотеки использовать оператор new, заключается в том, что это как бы противоречит цели этой конкретной библиотеки. Случай и точка: JQuery использует функцию "прокси конструктора". Просто введите что-то вроде console.log($.toString())и вы должны увидеть что-то вроде этого:

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

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

Обратите внимание, что я нацеливаюсь на Edge и выше, поэтому решение не должно работать в Internet Explorer. Под таргетингом на Edge я подразумеваю, что если он работает в Edge, то он, конечно, будет работать в любом другом браузере.

1 ответ

Ты можешь использовать Reflect.construct()

var funcThatGetsUsed = Reflect.contruct(internalFunc /* , [args] */ )
Другие вопросы по тегам