Class 的 new.target 属性

new是从构造函数生成实例对象的命令。ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。

  1. function Person(name) {
  2. if (new.target !== undefined) {
  3. this.name = name;
  4. } else {
  5. throw new Error('必须使用 new 命令生成实例');
  6. }
  7. }
  8. // 另一种写法
  9. function Person(name) {
  10. if (new.target === Person) {
  11. this.name = name;
  12. } else {
  13. throw new Error('必须使用 new 命令生成实例');
  14. }
  15. }
  16. var person = new Person('张三'); // 正确
  17. var notAPerson = Person.call(person, '张三'); // 报错

上面代码确保构造函数只能通过new命令调用。

Class 内部调用new.target,返回当前 Class。

  1. class Rectangle {
  2. constructor(length, width) {
  3. console.log(new.target === Rectangle);
  4. this.length = length;
  5. this.width = width;
  6. }
  7. }
  8. var obj = new Rectangle(3, 4); // 输出 true

需要注意的是,子类继承父类时,new.target会返回子类。

  1. class Rectangle {
  2. constructor(length, width) {
  3. console.log(new.target === Rectangle);
  4. // ...
  5. }
  6. }
  7. class Square extends Rectangle {
  8. constructor(length) {
  9. super(length, length);
  10. }
  11. }
  12. var obj = new Square(3); // 输出 false

上面代码中,new.target会返回子类。

利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。

  1. class Shape {
  2. constructor() {
  3. if (new.target === Shape) {
  4. throw new Error('本类不能实例化');
  5. }
  6. }
  7. }
  8. class Rectangle extends Shape {
  9. constructor(length, width) {
  10. super();
  11. // ...
  12. }
  13. }
  14. var x = new Shape(); // 报错
  15. var y = new Rectangle(3, 4); // 正确

上面代码中,Shape类不能被实例化,只能用于继承。

注意,在函数外部,使用new.target会报错。

es6 Class 的 new.target 属性相关推荐

  1. Hyperlink的target属性的用法

    大家可以看一下asp.net 的 ASP.NET Articles -- Updated Daily! ,点击链接在新窗口中打开某一篇文章,不要关闭打开的新窗口,点击另外一篇文章的链接,可以发现新的链 ...

  2. HTML的target属性中_blank、_self、_parent、_top含义

    _blank 浏览器会另开一个新窗口显示链接_self,在同一框架或窗口中打开所链接的文档. 此参数为默认值,通常不用指定. _parent,将链接的文件载入含有该链接框架的父框架集或父窗口中. 如果 ...

  3. a href a/target属性讲解

    <a></a> target属性 The target attribute specifies where to open the linked document: <a ...

  4. 如果希望单击超链接打开新的html,【单选题】如果希望单击超链接打开新的html页面,则需将target属性设置为 A. _blank B. _top C. _parent D. _self...

    [单选题]如果希望单击超链接打开新的html页面,则需将target属性设置为 A. _blank B. _top C. _parent D. _self 更多相关问题 一个球状蛋白质,含100个氨基 ...

  5. A href中target属性的用法

    A href中target属性的用法 target这个属性指定所链接的页面在浏览器窗口中的打开方式, 它的参数值主要有:_blank._parent._self._top,这些参数值代表的含义如下: ...

  6. target属性值的含义

    target属性值的含义: _blank:新建窗口 _self:相同窗口 _parent:父窗口 _top:首窗口 例子: window.open('url','_self'); <a href ...

  7. a标签的target属性

    a标签的target属性 前端a标签最重要的属性是href属性,实现页面的跳转.但是在当前页面显示还是在新页面中显示需要使用target属性控制 前端a标签最重要的属性是href属性,实现页面的跳转. ...

  8. HTML超链接a标签的herf、target属性用法

    HTML中a标签的herf.target属性的用法 在页面中超链接可以是一个字,一个词,或者一段话,也可以是一幅图像,可以点击这些内容来跳转到新的页面或者当前页面中的某个部分,在HTML中通常使用a标 ...

  9. .target 属性详解

    target属性用于返回最初触发事件的DOM元素. 在HTML文档中,我们为 元素绑定点击事件("click"),由于DOM元素的事件冒泡机制,我们点击 元素内的一个元素就可以触发 ...

最新文章

  1. 工具用途_机械加工中研磨加工刀具(砂轮)﹑治工具及其用途
  2. Linux解决编译Apache出现的问题:configure: error: APR not found
  3. SpringSecurity 权限控制之异常处理流程图
  4. ThinkPHP简单的验证码实现
  5. 打破情感分类准确率 80 分天花板!更加充分的知识图谱结合范式
  6. Java描述设计模式(10):组合模式
  7. 拦截游戏窗口被移动_熊孩子骗家长人脸识别? 腾讯游戏出了个新招
  8. 天梯—奇偶分家(C语言)
  9. Yii框架官方指南系列42——专题:验证和授权(Authentication and Authori
  10. halcon 深度学习标注_halcon深度学习: 分类
  11. Android RecyclerView 子条目(item)嵌套 RecyclerView
  12. 智能网关服务器,边缘计算网关和智能网关区别?
  13. BUG记录:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is no
  14. hangfire oracle,.net core 之Hangfire任务调度
  15. 汉语拼音的5个声调该怎么学?
  16. python抠图原理_一键智能抠图-原理与实现
  17. ffmpeg获取rtsp h265_用FFmpeg将rtsp视频流保存成H264、h265文件
  18. SAP那些事-职业篇-36-从“固定资产清理”科目说开去
  19. 如何理解广义线性回归分析Logistic输出的OR值?
  20. 14 款好用的 iOS 开发工具

热门文章

  1. angular.js的路由和模板在asp.net mvc 中的使用
  2. svn ignore 的用法
  3. 084 HBase的数据迁移(含HDFS的数据迁移)
  4. RedHat5 升级OpenSSH服务
  5. IOS-网络(数据安全:MD5加密)
  6. 4月15日SLB升级公告
  7. kindeditor编辑器 编辑器textarea不能获取到内容的解决办法
  8. Vertica DBD 分析优化设计
  9. 转载一个程序员的游戏之路
  10. 《Iphone SDK3开发快速上手》