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:void(0)的真正含义实例分析
Aug 20 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
Jan 20 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
May 05 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
JavaScript里四舍五入函数round用法实例
Apr 06 Javascript
javascript每日必学之封装
Feb 23 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
微信小程序自定义单项选择器样式
Jul 25 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效率,提高php性能的一些方法
2011/03/24 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
JS event使用方法详解
2008/04/28 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
python代码编写计算器小程序
2020/03/30 Python
numpy.array 操作使用简单总结
2019/11/08 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
总经理驾驶员岗位职责
2013/12/04 职场文书
产品生产计划书
2014/05/07 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
公司员工体检通知
2015/04/21 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android