全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

js es6系列教程 - 基于new.target属性与es5改造es6的类语法

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的类语法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# es6  # new.target  # javascript new.target的学习笔记  # 报错  # 给大家  # 使用了  # 可以用  # 要在  # 希望能  # 能让  # 要用  # 就得  # 这篇  # 写上  # 小编  # 大家多多  # 引入了  # console  # return  # instanceof  # log  # prototype  # showUserName 


相关文章: 如何通过商城自助建站源码实现零基础高效建站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  香港服务器如何优化才能显著提升网站加载速度?  如何在万网开始建站?分步指南解析  自助网站制作软件,个人如何自助建网站?  制作网站怎么制作,*游戏网站怎么搭建?  如何打造高效商业网站?建站目的决定转化率  网站制作费用多少钱,一个网站的运营,需要哪些费用?  建站之星导航配置指南:自助建站与SEO优化全解析  C++用Dijkstra(迪杰斯特拉)算法求最短路径  微信推文制作网站有哪些,怎么做微信推文,急?  高端建站如何打造兼具美学与转化的品牌官网?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  网站制作需要会哪些技术,建立一个网站要花费多少?  专业公司网站制作公司,用什么语言做企业网站比较好?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星安装路径如何正确选择及配置?  如何通过西部建站助手安装IIS服务器?  建站之星上传入口如何快速找到?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何在阿里云服务器自主搭建网站?  公司门户网站制作流程,华为官网怎么做?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  ,巨量百应是干嘛的?  如何用西部建站助手快速创建专业网站?  如何获取PHP WAP自助建站系统源码?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  安徽网站建设与外贸建站服务专业定制方案  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  建站之星免费模板:自助建站系统与智能响应式一键生成  建站之星如何快速解决建站难题?  如何快速搭建高效WAP手机网站吸引移动用户?  高端云建站费用究竟需要多少预算?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何高效搭建专业期货交易平台网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  C#怎么创建控制台应用 C# Console App项目创建方法  如何配置WinSCP新建站点的密钥验证步骤?  如何零基础开发自助建站系统?完整教程解析  如何彻底卸载建站之星软件?  javascript基本数据类型及类型检测常用方法小结 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。