你可能不知道的 new.target
new 是构造函数生成实例的命令, ES6为 new 命令引入了 new.target属性。这个属性用于确定构造函数是怎么调用的。
在构造函数中, 如果一个构造函数不是通过 new操作符调用的, new.target会返回 undefined。
使用场景
如果一个构造函数不通过 new 命令生成实例, 就报错提醒
es5中是这样做的:
function Shape(options) {
if (this instanceof Shape) {
this.options = options
} else {
// 要么手动给它创建一个实例并返回
// return new Shape(options)
// 要么提醒
throw new Error('Shape 构造函数必须使用 new 操作符')
}
}
es6中可以这样做:
function Shape(options) {
// if (new.target !== 'undefined') {} 必须要在 constructor中使用 new.target, 在这里判断会报错
constructor(options) {
if (new.target !== 'undefined') {
this.options = options
} else {
throw new Error('必须使用 new 操作符')
}
}
}
以上代码通过 new.target 属性判断返回的是不是undefined即可知道这个构造函数是不是通过 new 操作符调用
一个构造函数只能用于子类继承, 自身不能 new
new.target这个属性,当子类继承父类会返回子类的构造函数名称
class Parent {
constructor() {
console.log(new.target)
}
}
class Child extends Parent {
constructor() {
super()
}
}
// Child
以上代码 Child子类继承父类, 那么父类构造函数中的 new.target 是子类构造函数的名称。
规定构造函数只能用于继承
class Zoo {
constructor() {
if (new.target === Zoo) throw new Error('Zoo构造函数只能用于子类继承')
}
}
const zoo = new Zoo() // 报错
class Dog extends Zoo {
constructor() {
super()
}
}
const dog = new Dog() // 不报错
tip : new.target 在外部使用会报错
你可能不知道的 new.target的更多相关文章
- Spring中你可能不知道的事(一)
Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你可能不知道的陷阱, IEnumerable接口
1. IEnumerable 与 IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...
- 你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- swift与OC之间不得不知道的21点
swift与OC之间不得不知道的21点 自6月的WWDC大会上由苹果的大神Chris Lattner向我们首次展示swift至今已经大半年时间了,虽然绝大部分软件公司代码里还都见不到一丁点swif ...
- 你可能不知道的7个CSS单位
如果你是一名前端开发工程师,一般px和em使用频率比较高.但是今天本文的重点是介绍一些我们使用很少.甚至么有听说的单位. 一.重温em <style type="text/css&qu ...
- 你所不知道的15个Axure使用技巧
你有用原型开发工具吗?如果有,那你用的是Axure还是别的? 从以前就喜欢使用Axure,主要是觉得它能清楚的表达设计的思路,还有交互的真实再现,能让看的人一目了然,昨天看了这篇博文,便更加确定Axu ...
随机推荐
- Neutron命令测试3
1.打开Ubuntu的/etc/network/interfaces文件 .默认内容如下 auto lo iface lo inet loopback 2.如果以DHCP方式配置网卡,则改为:auto ...
- python 钩子函数
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...
- 零度4W1H提问规则
WHAT:您现在的需求和目的是什么,请按条理描述清楚. WHERE:在什么平台.环境和工具下发生此问题. WHEN:何时发生的该问题,该问题是否能够重现. WHY:为什么不能通过搜索引擎来解决您的问题 ...
- cookie乱码处理 示例
package com.log; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; ...
- jquery-validate插件
jQuery Validation 插件 优点:1.表单验证非常简单方便,并且提供了许多配置项目2.国际化,可以自定义提示信息 命令行安装 //初始化bowerbower init //使用bower ...
- jQueryMobile(二)
三].按钮 <!-- 一个jQueryMobile页面 --> <div data-role='page'> <div data-role='header'>< ...
- 通过adb获取应用的Activity堆栈信息
获取所用应用 adb shell dumpsys activity 获取自己的应用 adb shell dumpsys activity | grep 应用的package 获取处于栈顶的activi ...
- 3dsmax2014的下载、安装与注册激活教程详解
3dsmax2014的下载.安装与注册激活教程,虽然网上类似的教程文章不胜枚举,但大多比较粗枝大叶,没有详细的步骤,尤其对于电脑小白来说,更是不易参考,今天我就教大家如何注册破解3dsmax2014吧 ...
- May 6th 2017 Week 18th Saturday
A great ship asks deep water. 巨轮寻深水而航行. A great ship needs deep water so as to get enough buoyancy t ...
- 小程序wx.request的POST方法的参数传输服务器接收不到
这是API里面的例子: 而实际这样,服务端拿到的是空值. 将header更改一下,application/x-www-form-urlencoded,则可以让服务器收到数据