是否可以在JS中重新创建“新”运算符
Is it possible to recreate the "new" operator in JS?
我最近阅读了有关new
运算符的MDN文档,我对它的功能的简洁描述感到震惊:
当执行新的 Foo(...) 代码时,会发生以下情况:
- 创建一个新对象,继承自 Foo.prototype。
- 构造函数 Foo 使用指定的参数调用,并将其绑定到新创建的对象。
new Foo
相当于new Foo()
,即如果没有指定参数列表,则调用Foo。 没有参数。- 构造函数返回的对象将成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用步骤 1 中创建的对象 相反。(通常构造函数不返回值,但它们可以 如果他们想要覆盖正常的对象创建,请选择这样做 过程。
似乎这些东西都不是特权操作,那么是否有可能用其他语言结构完全重新创建new
的操作?
请注意,我不算Reflect.construct
因为它的定义是它"像新运算符一样充当函数"。
这个函数几乎重新创建了Reflect.construct
,因此new
(除了construct
的最后一个参数,它在使用new
运算符时没有等价物:
function fauxNew (constructor, args) {
// allocate a new object and set the prototype
var newObject = Object.create(constructor.prototype)
// call the constructor with "this" bound to the new object
var retVal = constructor.apply(newObject, args || [])
// if the constructor returned an object, return it;
// otherwise return the new object
var constructorReturnedAnObject =
!!retVal && ["object", "function"].indexOf(typeof retVal) !== -1
return constructorReturnedAnObject? retVal : newObject
}
下面是与一些测试用例一起提供的相同代码。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 为effect Composer创建GodRays效果过程
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- onkeyup无法动态创建多个文本区域
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何访问声音管理器2创建的声音对象
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 使用Facebook live API创建实时视频对象时的隐私设置
- 在动态创建的元素上获取对特定选择器的引用
- 如何创建带有插槽的vue js组件预加载程序
- 动态创建 JavaScript 新运算符
- 是否可以在JS中重新创建“新”运算符
- 为什么当我执行这个 JavaScript 语句来创建一个新的 Number 对象(使用 new 运算符)时,Chrome
- 我们如何使用新的运算符和工厂模式在JavaScript中创建类的实例
- 循环对象以使用javascript/Jquery创建AND运算符
- 如何在JavaScript中创建CoffeeScript风格的存在运算符
- Javascript使用按位或等于运算符|=来创建多边形
- ||(OR 运算符)在创建 jQuery 插件时