我的编程空间,编程开发者的网络收藏夹
学习永远不晚

class在es6中本质是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

以上就是class在es6中本质是什么的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

class在es6中本质是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

class在es6中本质是什么

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

abstract class和interface的本质是什么

本篇内容介绍了“abstract class和interface的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道abstr
2023-06-17

es6的class是干什么的

es6的class关键字用于快速地定义“类”;class的本质是function,它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。提升class不存在变量提升,类的所有方法都定义在类的prototype属性上面,在类的实例上面调用方法,其实就是调用原型上的方法。
2022-11-22

class在es6中怎么使用

今天小编给大家分享一下class在es6中怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。class在es6中本质是函
2023-07-04

es6中class继承调用super的原因是什么

本文小编为大家详细介绍“es6中class继承调用super的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6中class继承调用super的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-04

Linq本质是什么

这篇文章主要介绍“Linq本质是什么”,在日常操作中,相信很多人在Linq本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linq本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1.匿名类
2023-06-17

class在c++中是什么意思

在c++中,class关键字定义一个类,表示对象的模板。一个类包括数据成员(属性)、成员函数(方法)、构造函数(创建对象时调用)和析构函数(销毁对象时调用)。要使用类,需要创建对象,然后通过对象访问类的成员。class在C++中的含义在C
class在c++中是什么意思
2024-05-09

css的本质是什么

今天小编给大家分享一下css的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。css的本质是定义元素的样式规则,告诉
2023-07-05

Python的本质是什么

这篇文章主要介绍“Python的本质是什么”,在日常操作中,相信很多人在Python的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-02

java中注解的本质是什么

这篇文章给大家介绍java中注解的本质是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是
2023-06-14

Linq查询本质是什么

这篇文章主要介绍“Linq查询本质是什么”,在日常操作中,相信很多人在Linq查询本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linq查询本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-17

python import的本质是什么

这篇文章主要讲解了“python import的本质是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python import的本质是什么”吧!说明1、import的本质是路径搜索。2、
2023-06-20

http代理的本质是什么

这篇文章主要介绍“http代理的本质是什么”,在日常操作中,相信很多人在http代理的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”http代理的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-21

c#委托的本质是什么

委托是一种类型安全的指针,指向一个方法。它封装了方法引用,允许将方法作为参数传递,并提供了类型安全保障,强制方法签名与委托定义匹配。委托的本质委托本质上是一种类型安全的指针,它指向一个方法。详细解释在 C# 中,委托是一个类,它封装了
c#委托的本质是什么
2024-04-04

css的本质是什么意思

css的本质是定义元素的样式规则,告诉浏览器如何在网页中显示元素;css是指层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言;CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
2023-05-14

编程热搜

目录