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 相关文章推荐
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
js中格式化日期时间型数据函数代码
Nov 08 Javascript
在JavaScript并非所有的一切都是对象
Apr 11 Javascript
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
JS验证逗号隔开可以是中文字母数字
Apr 22 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
JS使用iView的Dropdown实现一个右键菜单
May 06 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
js实现轮播图效果 纯js实现图片自动切换
Aug 09 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
Jan 19 Javascript
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
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中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
JS Array对象入门分析
2008/10/30 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
js控制input输入字符解析
2013/12/27 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
python二维键值数组生成转json的例子
2019/12/06 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
英语系毕业生自荐信
2013/10/31 职场文书
中医专业应届生求职信
2013/11/17 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
平面设计专业求职信
2014/08/09 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
主持人开场白台词
2015/05/29 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
小学运动会入场口号
2015/12/24 职场文书
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python
Python合并pdf文件的工具
2021/07/01 Python
图文详解matlab原始处理图像几何变换
2021/07/09 Python
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript