对象自然函数
Object-Natured Functions
上下文
我注意到有些函数只能使用new
前缀进行调用。当在没有它的情况下调用时,会抛出错误非法调用。以下是控制台在以不同方式调用Image
时的反应的两个示例。
-> new Image();
<- <img>
-> Image();
<- TypeError: DOM object constructor cannot be called as a function.
更有趣的是,在更仔细的观察下,这些类型的函数看起来像函数,但事实并非如此。以Image
为例,typeof
命令表明Image
是一个函数,而Image
的构造函数暗示它是一个Object。
这与下面的大多数构造函数非常不同。
function Foo(){
this.identity = 'Bar';
}
函数Foo
可以通过两种方式调用,即new Foo()
和Foo()
。这与Image
函数非常不同。
问题
具有Image
函数的此操作与大多数构造函数非常不同。这怎么可能?这就是为什么new
前缀必须与Image
一起使用的原因吗?更重要的是,这种类型的函数可以重新创建吗?
我认为当new
关键字不用于创建Foo
:的实例时,这就是您正在寻找的再现异常的逻辑
function Foo() {
if (!(this instanceof arguments.callee))
throw new TypeError("DOM object constructor cannot be called as a function.");
this.identity = 'Bar';
}
根据这篇文章中的一些评论,如果你处于严格模式,你必须使用函数名Foo
,而不是arguments.callee
:
function Foo() {
if (!(this instanceof Foo))
throw new TypeError("DOM object constructor cannot be called as a function.");
this.identity = 'Bar';
}
请参见此处的演示,该演示说明了这种情况。
Image
的问题在于它是一个宿主对象,这意味着它不需要遵循本地EcmaScript对象的严格语义。例如,它可以从不是Function.prototype
的东西继承,实现内部的[[Construct]]方法,但不能实现[[Call]]和类似的东西。
它们是由DOM指定的(请参阅文档中的"new Image(("answers"new Option(("等构造函数在哪里?(,具体在这里:
提供了一个构造函数来创建
HTMLImageElement
对象(除了来自DOM的工厂方法,如createElement()
(:Image(width, height)
作为构造函数调用时,必须返回一个新的HTMLImageElement
对象(一个新img元素(。[…]
然而,它实现了特定于浏览器的功能:例如,Opera创建的图像也没有new
,而没有抛出NOT SUPPORTED
错误。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 对象自然函数