"Связывание" "нового" конструктора с функцией в 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] */ )