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仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
Bootstrap fileinput组件封装及使用详解
Mar 10 Javascript
微信小程序开发入门基础教程
Apr 19 Javascript
JavaScript创建对象的七种方式(推荐)
Jun 26 Javascript
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
原生JS实现小小的音乐播放器
Oct 16 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
微信小程序云开发之使用云函数
May 17 Javascript
浅析VUE防抖与节流
Nov 24 Vue.js
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设计模式之工厂模式与单例模式
2016/09/28 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
ElementUI之Message功能拓展详解
2019/10/18 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
Python类的继承和多态代码详解
2017/12/27 Python
基于Python的PIL库学习详解
2019/05/10 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
String是最基本的数据类型吗?
2013/06/13 面试题
.NET程序员的几道面试题
2012/06/01 面试题
监理员的岗位职责
2013/11/13 职场文书
重阳节标语大全
2014/10/07 职场文书
2014年店长工作总结
2014/11/17 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android