ES6中的类(Class)示例详解


Posted in Javascript onDecember 09, 2020

类的基本语法

ES6提供了更接近面向对象(注意:javascript本质上是基于对象的语言)语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。 基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

//定义类
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
//创建对象
let p = new Point(1,2);
console.log(p.toString());

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5的构造函数Point,对应ES6的Point类的构造方法。

Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。

注意:生成类的实例对象的写法,要使用new命令。如果忘记加上new,像ES5函数那样调用Class,将会报错。

// 报错
let point = Point(2,3);
// 正确
let point = new Point(2,3);

constructor方法

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

constructor() {}

注意:constructor方法默认返回实例对象(即this)

扩展:constructor方法默认返回实例对象(即this),但也可以指定返回另外一个对象。

样例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			class Point {
			  constructor() {
			    return new Date();
			    //return Object.create(null);
			  }
			}
			let p = new Point();  //返回为Date对象
			console.log(p);
			
		</script>
	</body>
</html>

效果截图:

ES6中的类(Class)示例详解

Constructor与普通构造函数的区别: 类的构造函数,不使用new是没法调用的,会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
let p = Point(); //TypeError: Class constructor Point cannot be invoked without 'new'

this与class(原型)

class:类,是对象的模板。(或者叫:原型) this:当前对象。 以上定义,与java中的概念是相同的。 但是,由于javascript语言自身的特点,关于class与this,还需要做进一步说明。

注意:在javascript中,在定义类完毕之后,还可以再添加属性和方法。

属性与方法添加到this上

class Point {
  constructor() { }
}
let p = new Point();
p.username = 'zhangsan';
console.log(p.username);  //zhangsan

上面代码中,Point类定义之后,给对象 p 又添加了一个username属性。这是完全可以的。 但是要注意:此种方式,仅仅是给对象p添加一个属性,而不是给类添加一个属性。 或者说: 此种方式,仅仅是给对象p的this添加一个属性,而不是给类添加一个属性。

class Point {
  constructor() { }
}
let p1 = new Point();
p1.username = 'zhangsan';
console.log(p1.username);  //zhangsan

let p2 = new Point();
console.log(p2.username);  //undefined

上面例子中,只给对象p1添加了username属性,但没有给类添加属性。 所以,p2对象中并没有username属性。

属性与方法添加到类上

class Point {
  constructor() { }
}
Point.prototype.username = 'zhangsan';

let p1 = new Point();
console.log(p1.username);  //zhangsan

let p2 = new Point();
console.log(p2.username);  //zhangsan

上面代码中,使用 Point.prototype方式,给类添加属性。 这样,类的所有对象(p1、p2)就都有username属性了。

在javascript中,每一个类都有一个prototype,它就是类的原型,类的所有实例共享一个原型。如果想访问这个原型,可以使用proto指针。

样例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			class Point {
			 constructor() { }
			}
			let p = new Point();
			console.log(p.__proto__);   //注意proto指针的写法
			/**
			 * 输出结果:
			 * {constructor: ƒ}
			 * constructor: class Point //这里证明:proto指针指向类的原型
			 * __proto__: Object
			 */
			
			
			
			let p1 = new Point();
			let p2 = new Point(); 
			//这里证明:类的所有实例共享一个原型 
			console.log(p1.__proto__===p2.__proto__); //true
		</script>
	</body>
</html>

效果截图:

ES6中的类(Class)示例详解

类的静态成员

样例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			class Point {
			  constructor() { }
			}
			Point.username = '牛哄哄的柯南';
			
			let p = new Point();
			console.log(p.username);    //undefined
			console.log(Point.username);  //牛哄哄的柯南
		</script>
	</body>
</html>

效果截图:

ES6中的类(Class)示例详解

上面代码中,直接使用 Point.username 方式给类添加一个属性,此种方式只是添加了一个静态属性,访问时,只能通过类名才能访问。

到此这篇关于ES6中类(Class)的文章就介绍到这了,更多相关ES6的类(Class)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript 提升运行速度之循环篇 译文
Aug 15 Javascript
javascript中onmouse事件在div中失效问题的解决方法
Jan 09 Javascript
通过js获取div的background-image属性
Oct 15 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
javascript实现tab切换的四种方法
Nov 05 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
JavaScript高级函数应用之分时函数实例分析
Aug 03 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 Javascript
JavaScript实现表单验证功能
Dec 09 #Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 #Javascript
javascript全局自定义鼠标右键菜单
Dec 08 #Javascript
javascript局部自定义鼠标右键菜单
Dec 08 #Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 #Javascript
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 #Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 #Vue.js
You might like
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
vuex操作state对象的实例代码
2018/04/25 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
python2.7的编码问题与解决方法
2016/10/04 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
如何学习Python time模块
2020/06/03 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
numba提升python运行速度的实例方法
2021/01/25 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
行政助理求职自荐信
2013/10/26 职场文书
体育委员竞选稿
2015/11/21 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
导游词之天津盘山
2019/11/01 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL