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 相关文章推荐
jQuery插件原来如此简单 jQuery插件的机制及实战
Feb 07 Javascript
js修改原型的属性使用介绍
Jan 26 Javascript
jQuery实现表格行上移下移和置顶的方法
May 22 Javascript
jQuery判断一个元素是否可见的方法
Jun 05 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
jQuery中layer分页器的使用
Mar 13 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
vue地区选择组件教程详解
May 04 Javascript
vue props传值失败 输出undefined的解决方法
Sep 11 Javascript
详解vue在项目中使用百度地图
Mar 26 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 Javascript
Openlayers+EasyUI Tree动态实现图层控制
Sep 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
一组SQL面试题
2016/02/15 面试题
武汉东之林科技有限公司机试
2013/09/17 面试题
室内设计自我鉴定
2013/10/15 职场文书
管理心得体会
2013/12/28 职场文书
消防先进事迹材料
2014/02/10 职场文书
防火标语大全
2014/10/06 职场文书
2015年元旦标语大全
2014/12/09 职场文书
诚信承诺书
2015/01/19 职场文书
婚宴父母致辞
2015/07/27 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
PHP解决高并发问题
2021/04/01 PHP