ES6 class——name属性与new.target属性

name属性与new.target属性
name属性: 1、类.name,输出的是类的名字。 2、如果是在类表达式中,类有名字,那么输出结果是类的名字;类没有名字的话,那么输出结果会是表达式中变量或者常量的名称。
            //name属性返回一个类的名字,在业务场景中基本上用不到的
            class Person{
                
            }
            console.log(Person.name);  //打印结果为Person
            
            //如果有类名,就返回类名而不是变量名;没有类名就会取前面的变量
            const Humen = class P{
                
            }
            console.log(Humen.name);  //打印结果为P
            
            
            





new.target属性: 1、new.target只能在构造函数中访问,返回类本身,指向的是使用new来实例化一个类的时候,new关键字后面的那个类。【比如new Car(),那new.target指向的就是Car这个类】 ES6的类是ES5的语法糖,也就是ES5中模拟类的另一种写法,是提供的另一种更为方便的写法。 2、ES5的普通构造函数(function)中也可使用new.target,若没有使用new来实例化function,则会返回undefind。 校验函数:判断普通函数是否被当作构造函数调用,即是否使用了new来实例化,有两种方法: 1)new.target ! == Car(函数名) 2)!(this instanceof Car)【this指向调用函数所返回的对象】
            
            //new.target不可以直接访问,只能在类,或者Es5的构造函数中访问得到
            class Car{
                constructor(){
                    console.log(new.target);  //new.target实际上指向的是new关键字后面的那个类(或者函数)
                }
            }
            
            new Car();



//在es5中,如果一个函数前面加上一个new关键字去进行调用的话,那这个函数就会被当做一个构造函数, //这也是在es5中去模拟一个类的核心,必须用构造函数模拟出一个类,把它作为一个类的入口 //语法糖 function Car1(){ //这是new.target比较重要的一个用法,在以前没有new.target的时候会使用instanceof去校验这个函数是否被当做构造函数去调用的 if(new.target !== Car1){ throw Error('必须使用new关键字调用Car') } } //当我们用new这个关键字去调用一个函数的时候,那么这个函数就会被作为构造函数进行调用 new Car1()


//作为构造函数进行调用的时候,它的流程稍微跟普通的函数有点不太一样 function Car2(){ //函数是否被当做构造函数去进行调用 if(!( this instanceof Car2) ){ throw Error('必须') } } new Car2()





原文地址:https://www.cnblogs.com/rickdiculous/p/13694025.html