ES6--class基本使用
类定义
ES6完整学习阮老师的ECMAScript6入门。
技术一般水平有限,有什么错的地方,望大家指正。
以前我们使用ES5标准定义一个构造函数的过程如下:
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.say = function(){
console.log("你好,我是"+this.name)
}
Person.prototype.show = function(){
console.log("年龄"+this.age+"一名小学生!");
}
通常首字母大写的函数我们称为构造函数(并不是一种语法约束,只是一种约定俗成的规律),属性写在方法里面,函数写在原型上面,这样实例化(new操作)出来的对象既有属性也有方法。
ES6为了更明朗构造函数这个概念了多了一个class语法,它会帮我们完成上面的一系列操作,我们可以把它看做是构造函数的变身,通常我们称为类。JS中的类同函数一样也有两种声明方式:
类声明:
class Person{
}
类表达式:
var Person = class {
}
现在我们利用类来对开始的构造函数进行变形:
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
say(){
console.log("你好,我是"+this.name);
}
show(){
console.log("年龄"+this.age+"一名小学生!");
}
}
我们实例化一个Person的对象,是可以正常使用的:
var me = new Person("zt",23);
me.say();
me.show();
原来的构造函数现在变成了一个类,constructor就是构造函数对参数进行初始化的变形,say和show就是构造函数原型上面的函数。
类就是对有同样特征的事物的一个统称,在JS的类里面只能包括函数,不能包含别的,如果我们需要给类添加一个属性只能通过get/set存取器方法来实现:
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
get message()
{
return "name:"+this.name+",age:"+this.age
}
}
var me = new Person("zt",23);
console.log(me.message);
constructor函数在类里面最多只能有一个,它的主要职能就是初始化属性,在执行new操作时先经由constructor函数将参数设置为对象的属性,如果不需要存在初始化属性那么constructor可以省略。
函数修饰
类里面定义的函数可以被修饰符修饰最常见的就是static。
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
static say(){
console.log("由类调用");
}
}
Person.say();
一旦一个函数被static修饰,那么这个函数就属于类了,可以直接由类名来调用Person.say()。而普通函数是不能直接由类进行调用的,普通函数只能由实例化的对象来调用,被static修饰的函数是不能被实例化的对象调用的只能通过类直接来进行调用,这种函数等价于我们以前直接利用Person.fn = function(){}定义工具函数一样。
类继承
一个类可以继承一个类,被继承的类我们一般称为父类,另一个称为子类,通过extends来实现:
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
static say(){
console.log("我是"+this.name);
}
}
class Student extends Person{
}
新创建的Student类是子类,Person类是父类,子类会拥有父类里面的所有函数(constructor和其他函数),子类继承来的函数都是可以直接使用的:
var stu = new Student("zt",23)
stu.say();
子类里面没有声明任何函数,仍然可以调用say,say就是通过继承得来的。
子类可以定义自己的特有的函数,如果和父类函数同名那么就父类的函数就不会生效而是使用子类自身的函数(就是ES5原型链查找的套路):
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
say(){
console.log("我是"+this.name);
}
}
class Student extends Person{
say(){
console.log("我是子类的say函数!")
}
fn(){
console.log("我是子类函数fn")
}
}
var stu = new Student("asaszt",23)
stu.say();//我是子类的say函数!
stu.fn();//我是子类函数fn
在子类中使用super
子类会继承父类的constructor函数来初始化自身的属性,同样也可以添加自身特有的属性,但是必须使用super来完成这个操作:
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
}
class Student extends Person{
constructor(name,age,sex){
super(name,age);
this.sex = sex;
}
}
var stu = new Student("zt",23,"男")
console.log(stu.sex);//男
在子类中使用constructor来初始化属性,首先使用super来对可继承的属性进行初始化,然后在通过this添加自身特有的属性,this只有在调用super()之后才会存在。
super同样可以调用父类的非静态函数(此时我们可以把super看做是一个父类实例化出来的一个对象):
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
say(){
console.log("我是父类的say函数");
}
}
class Student extends Person{
constructor(name,age,sex){
super(name,age);
this.sex = sex;
}
say(){
super.say();
console.log("我是子类的say函数");
}
}
var stu = new Student("zt",23)
stu.say();//我是父类的say函数 我是子类的say函数
ES6--class基本使用的更多相关文章
- ES6模块import细节
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...
- ES6(块级作用域)
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
- es6小白学习笔记(一)
1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...
- ES6之变量常量字符串数值
ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- ES6 箭头函数中的 this?你可能想多了(翻译)
箭头函数=>无疑是ES6中最受关注的一个新特性了,通过它可以简写 function 函数表达式,你也可以在各种提及箭头函数的地方看到这样的观点——“=> 就是一个新的 function”. ...
- ES6+ 现在就用系列(二):let 命令
系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...
- ES6+ 现在就用系列(一):为什么使用ES6+
系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...
随机推荐
- wordpress添加文章浏览统计(刷新不重复)
wordpress本身不带文章浏览统计,可以用插件wp-postview,但是刷新还是算一个浏览次数. 1.首先在主题下functions.php里增加以下代码,这段代码也是网上可以找到的 //add ...
- 同程旅游网开放平台SDK开发完成
最近利用业余时间,使用了同程旅游网的开放平台,并对大部分的方法进行了调用,发现有很多不好用的地方,比如 1.同一个开放平台居然有几个调用地址,景区调用http://tcopenapi.17usoft. ...
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
- java框架篇---spring AOP 实现原理
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- sqlmap 技巧整理
收集了一些利用Sqlmap做注入测试的TIPS,其中也包含一点绕WAF的技巧,便于大家集中查阅,欢迎接楼补充.分享. TIP1 当我们注射的时候,判断注入 http://site/script?id= ...
- Linux高级编程--05.文件读写
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...
- Lua中调用C函数
Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回 ...
- 和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一 ...
- Direct3D11学习:(二)基本绘图概念和基本类型
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ...
- 从IE6到IE11上运行WebGL 3D遇到的各种坑
这篇<基于HTML5的电信网管3D机房监控应用>基于WebGL技术的应用让少同学对HTML5 3D的应用产生了兴趣和信心,但有不少网友私信询问WebGL如何运行在老的IE678910浏览器 ...