class在es6中本质是什么

class在es6中本质是函数(构造器),使用的时候,也是直接对类使用new命令,跟构造函数的用法一致;class可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。用class定义类的方法“class Person{//类声明}”或“const Person=class{//类表达式}”。

class在es6中本质是什么

本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。

es6的Class类详解

class基本语法

JavaScript 语言中,生成实例对象的传统方法是通过构造函数和原型的组合模式.ES6 提供了更接近传统语言(java)的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

class point{    constructor(x,y){            this.x=x;        this.y=y;    }    play(){            console.log("我会玩");    }}

登录后复制

ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

注:“语法糖”:是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。

class在ES6本质就是函数(构造器)

1.png

class中的原型方法全部被添加到了parent的原型对象上

2.png

ES6 的class与ES5写法的几个核心注意点: ES5 的构造函数Point,对应 ES6 的Point类的构造方法。 类的所有方法都定义在类的prototype属性上面。 定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了 方法之间不需要逗号分隔,加了会报错 ES6的class使用方法与ES5的构造函数一模一样

//类的所有方法都定义在类的prototype属性上面。class piont{        constructor(){    //    }    play(){                }}//上述代码等价于point.prototype={        constructor() {    },    play(){    };}//在类的实例上面调用方法,其实就是调用原型上的方法。class Ba{    //}let b=new Ba();b.constructor===Ba.prototype.constructor//true

登录后复制

另外:ES5 的构造函数Point,对应 ES6 的Point类的构造方法。

由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。

class ponit{        constructor(){                }}Object.assign(Point.prototype,{    play(){    };})//Class直接定义的方法之间不需要逗号分隔,加了会报错. 但是这里是Object.assign的方法格式, 这里面需要往Point.prototype里面添加的方法就需要符合对象的默认格式

登录后复制

类的内部所有定义的方法,都是不可枚举的(non-enumerable)。通过Object.assign方法往类的原型上添加的方法,constructor不可枚举, 其他的可以枚举

Class的基本语法之constructor

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象 (得是在创造class时就定义设置的, 在创造完class后,通过Object.assign的方式是没法改变构造函数的返回值的).

Class的基本语法之类的调用方式

类必须使用new调用,否则会报错。这是它跟普通构造函数 ( 普通构造函数完全可以当做普通函数使用 ) 的一个主要区别,后者不用new也可以执行。

3.png

Class的基本语法之getter和setter

与 ES5 一样,在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。

  class demo{                constructor(age){                    this.age=agie;                this._age=age;            }            get age(){                    return this._age;            }            set age(value){                    this._age=value;                console.log("年龄"+value);            }        }        let kevin=new demo(9);        kevin.age=18;        console.log(kevin.age);

登录后复制

Class的基本语法之类的属性名

4.png

上面代码中,Square类的方法名getArea,是从表达式得到的。

Class的基本语法的特别注意点

(1)严格模式

类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。

(2)不存在提升

new foo();class foo{};

登录后复制

上面代码中,Foo类使用在前,定义在后,这样会报错,因为 ES6 不会把类的声明提升到代码头部。

(3)name 属性

class point{}point.name//point

登录后复制

由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。

(4)this 的指向

类的方法内部如果含有this,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

5.png

printName方法中的this,默认指向Logger类的实例。但是,如果将这个方法提取出来单独使用,this会指向该方法运行时所在的环境(由于 class 内部是严格模式,所以 this 实际指向的是undefined),从而导致找不到print方法而报错。

解决办法:

一个比较简单的解决方法是,在构造方法中绑定this,这样就不会找不到print方法了。

另一种解决方法是使用箭头函数。箭头函数位于构造函数内部,它的定义生效的时候,是在构造函数执行的时候。这时,箭头函数所在的运行环境,肯定是实例对象,所以this会总是指向实例对象。

class Logger{        constructor(){            this.printName=this.printName.bind(this);        //但是请注意bind之后返回的函数里面的this就永久锁死了问题:!!! !!! 坚决别用     }}//箭头函数class Obj{        constructor(){            this.getThis=()=>this;    }}let o=new Obj();o.getThis()===o//true

登录后复制

Class的静态属性和方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

 class Person{                static sum=0;            constructor(){                    this.add();            }            add(){                    Person.sum++;            }        }        let kaiwen=new Person();        console.log("当前的聊天室人数为:"+Person.sum);        //作用:当没有实例化的时候,我们可以通过静态的属性和方法去获取一些信息 // 注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。静态方法可以与非静态方法重名。

登录后复制

父类的静态方法,可以被子类继承静态方法也是可以从super对象上调用的。

 class Person{                constructor(name){                    this.name=name;                this.sex="男";            }        }        class Student extends Person{                constructor(name,age){                    super(name);                this.age=age;            }        }        let s=new Student("张三",11);        console.log(s.name);        console.log(s.age);        console.log(s.sex);

登录后复制

Class的私有方法和私有属性

私有方法和私有属性:是只能在类的内部访问的方法和属性,外部不能访问。 这是常见需求,有利于代码的封装,但 ES6 不提供,只能通过变通方法模拟实现。

_bar方法前面的下划线,表示这是一个只限于内部使用的私有方法。但是,这种命名是不保险的,在类的外部,还是可以调用到这个方法

下面代码中的写法不仅可以写私有属性,还可以用来写私有方法

 class Cat{                #eyes="眼睛";            static pai(){                    console.log("凯文");            }            say(){                    Cat.pai();                console.log("猫有一双大大的"+this.#eyes);            }        }        let kate=new Cat();        kate.say();

登录后复制

私有属性也可以设置 getter 和 setter 方法。

私有属性不限于从this引用,只要是在类的内部,实例也可以引用私有属性。

构造函数的新属性

ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。

私有属性也可以设置 getter 和 setter 方法。

私有属性不限于从this引用,只要是在类的内部,实例也可以引用私有属性。

构造函数的新属性

ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。

6.png

【相关推荐:javascript视频教程、编程视频】

以上就是class在es6中本质是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2924826.html

(0)
上一篇 2025年3月11日 19:00:44
下一篇 2025年3月8日 03:39:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • es6中find()怎么用

    在es6中,find()用于通过回调函数查找数组中符合条件的第一个元素的值,语法“array.find(function(…),thisValue)”。find()会为数组中的每个元素都调用一次函数执行,当数组中的元素在测试条件…

    2025年3月11日 编程技术
    200
  • JavaScript更新到了es几

    JavaScript更新到了es13了。2022年6月22日,第123届Ecma大会批准了ECMAScript2022语言规范,这意味着它现在正式成为JavaScript标准;而ECMAScript2022是第13次迭代,因此也可称为ECM…

    2025年3月11日
    200
  • JavaScript普通函数有原型吗

    JavaScript普通函数有原型。在JavaScript中,任何一个函数都有一个prototype(原型)属性,这个属性指向函数的原型对象。原型的作用其实就是为类(函数)提供了一个“公共区域”,在这个公共区域中声明的属性和方法能够被所有通…

    2025年3月11日 编程技术
    200
  • es6 map成员是唯一的么

    es6 map成员是唯一的。ES6新增的Map数据结构类似于对象,key值不限于字符串,成员值唯一;Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。Map对象保存键值对,并且能够记住键的原始插入顺序;任何值(对象或者原始值…

    2025年3月11日
    200
  • es6怎么实现字符串反转

    实现方法:1、用split、reverse和join函数,语法“str.split(”).reverse().join(”);”;2、用递减的for循环,语法“for(i=字符串长度-1;i>=0;i&#821…

    2025年3月11日
    200
  • es6怎么找出2个数组中不同项

    步骤:1、将两个数组分别转为set类型,语法“newA=new Set(a);newB=new Set(b);”;2、利用has()和filter()求差集,语法“new Set([…newA].filter(x =>!n…

    2025年3月11日 编程技术
    200
  • es6中有没有&符号

    有&符号。在es6中,“&&”是逻辑与运算符,是一种AND布尔操作,语法为“操作数1 && 操作数2”;只有两个操作数都为true时,才返回true,否则返回false。逻辑与是一种短路逻辑,如果左侧…

    2025年3月11日
    200
  • jquery是库吗

    jquery是库。jquery是一个优秀的JavaScript代码库,是为了简化JS的开发或者DOM等操作而开发的一种类库;它封装了JS常用的功能代码(函数),提供一种简便的JS设计模式,优化了HTML文档操作、事件处理、动画设计、Ajax…

    2025年3月11日
    200
  • es6中什么是类的静态成员

    在es6中,由类直接调用的属性和方法叫静态成员。在类里面对变量、函数加static关键字,那它就是静态成员;静态成员不会被实例化成为新对象的元素。静态成员和实例成员的区别:1、实例成员属于具体的对象,而静态成员为所有对象共享;2、静态成员是…

    2025年3月11日
    200
  • es6 map有序吗

    map是有序的。ES6中的map类型是一种储存着许多键值对的有序列表,其中的键名和对应的值支持所有数据类型;键名的等价性判断是通过调用“Objext.is()”方法来实现的,所以数字5与字符串“5”会被判定为两种类型,可以分别作为两种独立的…

    2025年3月11日
    200

发表回复

登录后才能评论