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应该怎样学
Apr 16 Javascript
JS 类型转换常见方法小结
May 31 Javascript
Package.js  现代化的JavaScript项目make工具
May 23 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
js正则表达式中test,exec,match方法的区别说明
Jan 29 Javascript
js防阻塞加载的实现方法
Sep 09 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
node.js中debug模块的简单介绍与使用
Apr 25 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
jQuery实现轮播图及其原理详解
Apr 12 jQuery
webpack3.0升级4.0的方法步骤
Apr 02 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 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
Jquery之美中不足小结
2011/02/16 Javascript
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
Python中的getopt函数使用详解
2015/07/28 Python
Python 探针的实现原理
2016/04/23 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
python实现XML解析的方法解析
2019/11/16 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
python中id函数运行方式
2020/07/03 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
小学生自我评价范例
2013/09/24 职场文书
个人找工作的自我评价
2013/10/17 职场文书
蔬菜基地的创业计划书
2014/01/06 职场文书
银行员工犯错检讨书
2014/09/16 职场文书