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 相关文章推荐
firefox下jquery iframe刷新页面提示会导致重复之前动作
Dec 17 Javascript
让你的博客飘雪花超出屏幕依然看得见
Jan 04 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
JavaScript中使用自然对数ln的方法
Jun 14 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
拥有一个属于自己的javascript表单验证插件
Mar 24 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
详解Vue-基本标签和自定义控件
Mar 24 Javascript
js正则相关知识点专题
May 10 Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 Javascript
vue2路由方式--嵌套路由实现方法分析
Mar 06 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 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模拟登陆的实现方法分析
2015/01/09 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
js中开关变量使用实例
2017/02/24 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
django2笔记之路由path语法的实现
2019/07/17 Python
python redis存入字典序列化存储教程
2020/07/16 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
python实现定时发送邮件
2020/12/23 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
就职演讲稿范文
2014/05/19 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
代办出身证明书
2014/10/21 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL