今天在处理一个问题的时候无意中发现一个新的问题,对象内的简写方法不能用作构造函数使用,而属性赋值的匿名函数可以。

const obj1 = {f:function () {this.num = 0;}
}
const obj2 = {f() {this.num = 0;}
}
new obj1.f(); // f {num: 0}
new obj2.f(); // Uncaught TypeError: obj2.f is not a constructor

为此专门去和同学讨论和搜索了一下,后面放上是相关链接的 google 机翻,
总的结果就是,

未标识为构造函数的内置函数对象不实现 [[Construct]] 内部方法,

[[Construct]]是我们使用newsuper创建新对象时使用的东西,

只有类型的函数 Normal才能构造和实现[[Construct]]

所以,只有 Normal 类型的函数(也就是用 function 关键字构造的函数)是可作为构造器使用的,
其他类型的函数(箭头函数、方法简写,generator)都无法使用构造器,也就是说,不能用 new 操作符调用。


MDN: TypeError: “x” is not a constructor

是因为尝试将不是构造器的对象或者变量来作为构造器使用。


原文链接

阅读规范会发现 JavaScript 对象具有定义其特定行为的内部方法。

ECMAScript 引擎中的每个对象都与一组定义其运行时行为的内部方法相关联。

有“基本的内部方法”,范围从例如[[GetPrototypeOf]][[OwnPropertyKeys]].

当我们处理函数时(记住这些也是对象),还可以有“附加的基本内部方法”,其中包括[[Call]][[Construct]][[Construct]]是我们使用newsuper创建新对象时使用的东西。

事实证明,并非每个函数都包含[[Construct]],这意味着并非每个函数都是构造函数。

未标识为构造函数的内置函数对象不实现 [[Construct]] 内部方法,除非在特定函数的描述中另有说明。

查看操作的定义,new我们会看到它应该在TypeError任何时候抛出一个isConstructor错误。isContructor查找[[Construct]]内部方法。

那么,让我们看看下面的三行代码,看看当我们想要使用 函数 Fn Arrow Shorthand作为构造函数时会发生什么:

const example = {Fn: function() { console.log(this); },Arrow: () => { console.log(this); },Shorthand() { console.log(this); }
};new example.Fn();        // Fn {}
new example.Arrow();     // Uncaught TypeError: example.Arrow is not a constructor
new example.Shorthand(); // Uncaught TypeError: example.Shorthand is not a constructor

每个函数创建的定义都归结为FunctionCreateEcmaScript 规范中的定义。

规格FunctionCreate非常明确:

FunctionCreate

FunctionCreate (kind, ParameterList, Body, Scope, Strict, prototype)

The abstract operation FunctionCreate requires the arguments: kind which is one of (Normal, Method, Arrow), a parameter list production specified by ParameterList, a body production specified by Body, a Lexical Environment specified by Scope, a Boolean flag Strict, and optionally, an object prototype. FunctionCreate performs the following steps:

  1. If the prototype argument was not passed, then

    1. Let prototype be the intrinsic object %FunctionPrototype%.
  2. If kind is not Normal, let allocKind be "non-constructor".
  3. Else let allocKind be "normal".
  4. Let F be FunctionAllocate(prototype, Strict, allocKind).
  5. Return FunctionInitialize(F, kind, ParameterList, Body, Scope).

所以事实证明,只有类型的函数Normal才能构造和实现[[Construct]]。进一步阅读规范,您会发现箭头函数使用 kindArrow而方法简写定义使用 kind Method。这导致它们成为“非构造函数”。


【捣鼓】TypeError: “x” is not a constructor相关推荐

  1. 捣鼓 Subversion

    开始捣鼓Subversion了,准备明天将它用于项目的版本控制.   SVN真是个复杂的东西,我又没用过CVS的经验,单单是安装和访问就搞了好长时间.   现在把过程记下来,首先呢,让后来者少走弯路. ...

  2. TypeError: BlobBuilder is not a constructor

    var BlobBuilder = window.BlobBuilder || window.MozBlobBuilder || window.WebKitBlobBuilder || window. ...

  3. TypeError: CleanWebpackPlugin is not a constructor

    在项目中引入clean-webpack-plugin打包后报错 new CleanWebpackPlugin(), ^ TypeError: CleanWebpackPlugin is not a c ...

  4. 捣鼓PlantUML(三、时序图)

    简单介绍 时序图(Sequence Diagram),又名序列图.循序图.顺序图,是一种UML交互图.它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作.它可以表示用例的行为顺序,当执行一 ...

  5. 捣鼓PlantUML

    捣鼓PlantUML(一.环境)http://blog.csdn.net/zh_weir/article/details/53006537 捣鼓PlantUML(二.组件图)http://blog.c ...

  6. 不务正业,捣鼓了一个破网站,全过程记录

    文章目录 为什么会有这个网站 预览几个页面 网站的缺陷 网站搭建过程 1. 服务器 2. 域名 3. html + js + css 4. 图片转换 5. 安装 web 服务器 6. 站点部署 小结 ...

  7. 捣鼓车间 | 学生获奖作品:戒烟帽

    全文约3000字,阅读时间8分钟 作者:陈朔(杭州拱墅区新城实验小学) 指导老师:铁熊(捣鼓车间) 本作品曾获得过 2018 年杭州市第三届青少年创客大赛最佳作品奖.2018 年浙江省中小学信息技术创 ...

  8. 第0节为啥捣鼓Busybox-Vi

    一.Busybox是啥? Busybox是嵌入式系统中用于制作根文件系统的主流工具软件.既然是根文件系统,那么,在根文件系统中具备编辑文本的功能将是非常有必要的. 二.什么是Busybox-vi 在嵌 ...

  9. ubuntu php7 pdo,记录捣鼓ubuntu下PHP7.1下安装sqlserver拓展

    记录捣鼓ubuntu下PHP7.1下安装sqlserver拓展 由于工作需要,得使得PHP支持sqlserver拓展来操作sqlserver数据库. 但是进行到Step2.1时,通过phpinfo() ...

  10. 在Centos7下捣鼓邮件发送软件sendmail与postfix

    虽然只是在整GITLAB过程中的一个小插曲,却意外的难搞, 花了我很多时间,网络上的各种教程与排错众说纷纭,看似简单的功能变得异常复杂. 邮件发送功能, 即MTA做为许多系统的必备,最常用的有send ...

最新文章

  1. python asyncio文件操作_Python asyncio文档阅读摘要
  2. 谭浩强C程序设计的课后习题答案
  3. 绿证交易全凭自愿 哪些企业会为其买单?
  4. java 匿名初始化_Java:双括号初始化 /匿名内部类初始化法
  5. 股票预埋单第二天还有效么?
  6. python 中 print 函数用法总结
  7. 抓包工具 tcpdump tshark
  8. Atitit 施政策略总结 目录 1. 行政综合方面的策略 2 1.1. 加强宣传无处不在策略 占领各大网络与实体阵地 2 1.2. 装点门面,不花钱或者少花钱的东西体系全部搞起来 2 1.3. 加大
  9. 搜狗输入法在别的屏幕
  10. 从 NASL 说开:低代码编程语言能饭否
  11. 孤独星球android app,孤独星球免费版
  12. java date 年龄_Java 根据年月日精确计算年龄
  13. MySQL索引面试题六连击
  14. 顺序容器迭代器之鄙见
  15. Teamview 禁用QuickConnect按钮
  16. Linux网络服务之----DHCP篇
  17. 《机器学习实战》— k-近邻算法
  18. python 判断是否为数字(整型、浮点型),Python中判断输入是否为数字的实现代码
  19. 竞价排名的优点与缺点-金瑞帆建站
  20. 今天心情不错,写个随笔。

热门文章

  1. 将自己的数据制作成cityscape格式
  2. App消息推送的原理
  3. 操作——UE常用快捷键
  4. java.lang.UnsupportedOperationException: This is supposed to be overridden by subclasses
  5. Ques核心思想——CSS Namespace
  6. java xheditor 上传图片_xheditor上传图片的java实现
  7. java找不到符号 符号:类Xxx 位置xxx的解决方案
  8. Linux武侠文字游戏,怀旧的文字游戏,文字武侠手游哪个好玩?
  9. 06.第七章、成本管理
  10. Linux解决Device eth0 does not seem to be present,delaying initialization问题