栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何检测一个函数是否被称为构造函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何检测一个函数是否被称为构造函数?

我认为[ES2015之前]您想要的东西是不可能的。函数内根本没有足够的信息来进行可靠的推断。

查看ECMAscript 3rd Edition规范,

new x()
调用时所采取的步骤实质上是:

  • 创建一个新对象
  • 将其内部的[[Prototype]]属性分配给的prototype属性
    x
  • x
    正常调用,将新对象传递给
    this
  • 如果调用
    x
    返回了对象,则返回它,否则返回新对象

对于执行该代码而言,没有什么有用的关于函数调用的方法,因此,唯一可以在内部进行测试的

x
就是
this
值,这就是所有答案的作用。正如您所观察到的,的新实例
x
时调用
x
的构造函数是从预先存在的实例不可区分的
x
方式是:传递
this
时调用
x
一个函数,

除非* 你指定一个属性被创建的每个新的对象
x
,因为它构造:

function x(y) {    var isConstructor = false;    if (this instanceof x // <- You could use arguments.callee instead of x here,    // except in in Ecmascript 5 strict mode. && !this.__previouslyConstructedByX) {        isConstructor = true;        this.__previouslyConstructedByX = true;    }    alert(isConstructor);}

显然,这并不理想,因为您现在

x
可以覆盖每个由此构造的对象的多余的属性,但是我认为这是您可以做的最好的事情。

(*) “ instance of”是一个不准确的术语,但足够接近,并且比“

x
作为构造函数调用而创建的对象”更为简洁



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426161.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号