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中遭遇级联表达式陷阱
Mar 08 Javascript
js监听表单value的修改同步问题,跨浏览器支持
Dec 31 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
利用JavaScript检测CPU使用率自己写的
Mar 22 Javascript
用js的document.write输出的广告无阻塞加载的方法
Jun 05 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
Jul 11 Javascript
小程序实现上传视频功能
Aug 18 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
ADODB的数据库封包程序库
2006/12/31 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
总结Python编程中函数的使用要点
2016/03/20 Python
python 系统调用的实例详解
2017/07/11 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
Opencv求取连通区域重心实例
2020/06/04 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
如何理解transaction事务的概念
2015/05/27 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
高级方案规划工程师岗位职责
2013/11/29 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python