js es6系列教程 - 基于new.target属性与es5改造es6的类语法


Posted in Javascript onSeptember 02, 2017

es5的构造函数前面如果不用new调用,this指向window,对象的属性就得不到值了,所以以前我们都要在构造函数中通过判断this是否使用了new关键字来确保普通的函数调用方式都能让对象复制到属性

function Person( uName ){
  if ( this instanceof Person ) {
   this.userName = uName;
  }else {
   return new Person( uName );
  }
 }
 Person.prototype.showUserName = function(){
  return this.userName;
 }
 console.log( Person( 'ghostwu' ).showUserName() );
 console.log( new Person( 'ghostwu' ).showUserName() );

在es6中,为了识别函数调用时,是否使用了new关键字,引入了一个新的属性new.target:

1,如果函数使用了new,那么new.target就是构造函数

2,如果函数没有用new,那么new.target就是undefined

3,es6的类方法中,在调用时候,使用new,new.target指向类本身,没有使用new就是undefined

function Person( uName ){
   if( new.target !== undefined ){
    this.userName = uName;
   }else {
    throw new Error( '必须用new实例化' );
   }
  }
  // Person( 'ghostwu' ); //报错
  console.log( new Person( 'ghostwu' ).userName ); //ghostwu

使用new之后, new.target就是Person这个构造函数,那么上例也可以用下面这种写法:

function Person( uName ){
   if ( new.target === Person ) {
    this.userName = uName;
   }else {
    throw new Error( '必须用new实例化' );
   }
  }
  
  // Person( 'ghostwu' ); //报错
  console.log( new Person( 'ghostwu' ).userName ); //ghostwu
class Person{
   constructor( uName ){
    if ( new.target === Person ) {
     this.userName = uName;
    }else {
     throw new Error( '必须要用new关键字' );
    }
   }   
  }

  // Person( 'ghostwu' ); //报错
  console.log( new Person( 'ghostwu' ).userName ); //ghostwu

上例,在使用new的时候, new.target等于Person

掌握new.target之后,接下来,我们用es5语法改写上文中es6的类语法

let Person = ( function(){
   'use strict';
   const Person = function( uName ){
    if ( new.target !== undefined ){
     this.userName = uName;
    }else {
     throw new Error( '必须使用new关键字' );
    }
   }

   Object.defineProperty( Person.prototype, 'sayName', {
    value : function(){
     if ( typeof new.target !== 'undefined' ) {
      throw new Error( '类里面的方法不能使用new关键字' );
     }
     return this.userName;
    },
    enumerable : false,
    writable : true,
    configurable : true
   } );

   return Person;
  })();

  console.log( new Person( 'ghostwu' ).sayName() );
  console.log( Person( 'ghostwu' ) ); //没有使用new,报错

以上这篇js es6系列教程 - 基于new.target属性与es5改造es6的类语法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
Jun 24 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
Aug 13 Javascript
JS实现双击屏幕滚动效果代码
Oct 28 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
Node.js系列之安装配置与基本使用(1)
Aug 30 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 #Javascript
使用vue-resource进行数据交互的实例
Sep 02 #Javascript
jquery tmpl模板(实例讲解)
Sep 02 #jQuery
自制简易打赏功能的实例
Sep 02 #Javascript
Vue使用vue-cli创建项目
Sep 01 #Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 #Javascript
ionic2懒加载配置详解
Sep 01 #Javascript
You might like
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
javascript常用的方法整理
2015/08/20 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
scrapy爬虫完整实例
2018/01/25 Python
python之文件读取一行一行的方法
2018/07/12 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python实现三壶谜题的示例详解
2020/11/02 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
经典禁毒标语
2014/06/16 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
三潭印月的导游词
2015/02/12 职场文书
python开发飞机大战游戏
2021/07/15 Python
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技