【问题标题】:'Binding' The 'new' Constructor To A Function In Javascript在Javascript中将“新”构造函数“绑定”到函数
【发布时间】:2017-05-23 23:26:30
【问题描述】:

我正在创建一个库,其中的函数每秒可能被调用数千次。此函数需要new 构造函数,以便将一组新数据绑定到固定原型,如下所示:

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

所以,我目前使用 new 构造函数调用 internalFunc 的方式是使用第二个函数,类似于人们可以称之为“构造函数代理”的函数。

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

但是,回到主要问题,这个funcThatGetsUsed 每秒可以被调用数千次。因此,它可能会减小库的大小,并且如果我能够消除中间人“构造函数代理”函数并将新构造函数绑定到internalFunc,它可能会提高代码的速度,也许在与bind 函数类似的方式如下:

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

那么,有没有办法在 javascript 中使用 'bindToConstructor' 来减少函数调用开销?

请注意,我不能只告诉库的用户使用 new 运算符的原因是因为这会破坏这个特定库的目的。案例和要点:JQuery 使用“构造函数代理”功能。只需输入console.log($.toString()) 之类的内容,您应该会看到如下内容:

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

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

请注意,我的目标是 Edge 及更高版本,因此该解决方案不必在 Internet Explorer 中工作。我所说的“以 Edge 为目标”的意思是,如果它可以在 Edge 中运行,那么它当然可以在所有其他浏览器中运行。

【问题讨论】:

  • 顺便说一句,您不必担心额外的函数调用,而应该担心每秒实例化数千个对象。
  • an idea in an operator proposal 对应于 internalFunc::new,可以满足您的需求。但是没有。
  • @Bergi 请阅读整个问题。这就是我目前正在做的事情,但我只是好奇是否有更有效的方法。另外,这是针对我正在编写的图书馆的。作为图书馆的作者,我的目标是通过每秒调用数千次来使图书馆尽可能高效地为滥用它的人提供服务。
  • 我的确切答案是“不,没有”(除了将new 放在通话位置)。

标签: javascript constructor new-operator function-calls overhead-minimization


【解决方案1】:

您可以使用Reflect.construct()

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

【讨论】:

  • 这不会绑定任何东西,它只是替换了new 运算符(并且需要将参数作为数组传递)
  • 这正是我想要的!非常感谢!只要允许,我就会将您的答案标记为已接受!
  • @Bergi 这个问题有几个层次。查询的一部分是如何不使用new 运算符虽然达到相同的结果。您可能可以在 OP 中选择一个或多个层,通过研钵和研杵放置。
  • @Bergi "请注意,我不能只告诉库的用户使用 new 运算符的原因是因为这会破坏这个特定库的目的。”
  • 强调“可能性”。当前的引擎可能只针对 new 运算符进行优化,但未来的引擎有可能比“构造函数代理”功能更好地优化 Reflect.contruct
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2021-06-17
  • 2014-06-05
相关资源
最近更新 更多