2.ES6引进的新特性——类Class
为什么?
ES6中引入了类,类在java/c++等面向对象的编程语言常见,JS引入类是为了在日后使用js开发大型的应用程序,类本质是语法糖(语法上更加人性化)
以前写一个类
function User(name, age){
this.name = name;
this.age = age;
} // 静态方法
User.getClassName = function () {
return 'User'
}; // 为类添加公用方法,在原型对象上加
User.prototype.changeName = function (name) {
this.name = name
}
User.prototype.changeAge = function (age) {
this.age = age
} // 为类添加取值函数与存值函数(都要写到原型对象上去)
Object.defineProperty(User.prtotype, 'info', {
get(){
return 'name:' + this.name + ' | age:' + this.age;
}
}); // 新建一个子类
function Manager(name, age, password){
User.call(this,name,age); // 也可以User.apply(this, arguments),意思是调用父类的构造函数,从而达到继承父类属性的效果,注意,只能继承父类实例属性,而继承不了父类的方法
this.password = password;
}
// 继承静态方法
Manager._proto_ = User;
// 继承prototype方法(继承父类方法)
Manager.prototype = User.prototype; // 也可以Manager.prototype = new User()
// 添加新方法
Manager.prototype.changePassword = function(pwd){
this.password = password;
}; // 验证是否能继承
var manager = new Manager('kkk', 22, '123');
manager.changeName('lighter');
console.log(manager.name) // 输出 lighter
console.log(manager.info); // 输出 name:lighter | age:22
可以看出,以前ES5写一个类,虽然可以实现类的继承,但是很不优雅--!
ES6优雅写类
我们来注释上面的代码,一段一段地看它们又什么区别
//function User(name, age){
// this.name = name;
// this.age = age;
//} class User{
constructor(name, age){
this.name = name;
this.age = age;
} //// 静态方法
//User.getClassName = function () {
// return 'User'
//}; // 静态方法
User.getClassName = function () {
return 'User';
} //// 为类添加公用方法,在原型对象上加
//User.prototype.changeName = function (name) {
// this.name = name
//}
//User.prototype.changeAge = function (age) {
// this.age = age
//} // 为类添加公用方法,在原型对象上加
changeName(name) {
this.name = name
}
changeAge(age) {
this.age= age
} //// 为类添加取值函数与存值函数(都要写到原型对象上去)
//Object.defineProperty(User.prtotype, 'info', {
// get(){
// return 'name:' + this.name + ' | age:' + this.age;
// }
//}); // 为类添加取值函数与存值函数(都要写到原型对象上去)
get info() {
return 'name:' + this.name + ' | age:' + this.age;
} } // 新建一个子类
//function Manager(name, age, password){
// User.call(this,name,age);
// this.password = password;
//}
//// 继承静态方法,原型链就是实力对象_proto_属性
//Manager._proto_ = User;
//// 继承prototype方法
//Manager.prototype = User.prototype; class Manager extends User{
constructor(name, age, password){
super(name,age);
this.password = password;
} //// 添加新方法
//Manager.prototype.changePassword = function(pwd){
// this.password = password;
//}; changePassword(password){
this.password = password
}
} // 然后下面的用法都是一样的。 // 验证是否能继承
var manager = new Manager('kkk', 22, '123');
manager.changeName('lighter');
console.log(manager.name) // 输出 lighter
console.log(manager.info); // 输出 name:lighter | age:22
语法糖
注意,例如上面写的class 等概念,就是语法糖,它方便了我们写代码,使得代码更加地简洁,无论是class User ,还是class Manager,它们本质都是function
console.log(typeof User, typeof Manager); //输出 function function
简写继承
class I extends User {
}
var me = new I('psg', 23);
console.log(me); //不报错,输出 I {name: 'psg', age: 23}
上面继承没加构造函数constructor,但是内部默认会加,上面的代码会变成下面这个样子:
class I extends User{
constructor(...arg){
super(...arg);
}
}
总结ES6继承的重点
1.继承时候,如果手写构造函数,那么在constructor块里面,第一行写super(....),因为它要先创建父类的对象,然后所有的方法(上面的changePassword)、属性(上面的password)都会加到父类创建的对象上。
2.使用super可以改变父类的方法,例如上面的Manager类,它继承User父类,现在我想改变从父类中继承的info方法,我加一点东西,使我Manager有别于父类,但是我还是调用同样父类方法的名字,这时我可以这样写:
class Manager extends User{
constructor(name, age, password){
super(name,age);
this.password = password;
} //// 添加新方法
//Manager.prototype.changePassword = function(pwd){
// this.password = password;
//}; changePassword(password){
this.password = password
}
//使用super改写父类的方法
get info() {
var info = super.info; // 注意!!这里的info没有()
console.log(info);
return info + '--new'
}
}
var manager = new Manager('kkk', 22, '123');
console.log(manager.info);
// 输出 name:lighter | age:22
// 输出 name:lighter | age:22---new
创建立即执行的类
'use strict'
let user = new class User{
constructor(name){
this.name = name;
}
}('psg'); console.log(user); //输出 User {name: 'psg'}
不被提升
'use strict' var user = new User(); class User{
constructor(name){
this.name = name;
}
} console.log(user); //ReferenceError: User is not defined
-----完-----
2.ES6引进的新特性——类Class的更多相关文章
- 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类
一.对象的扩展 1.1对象属性名表达式 ES6可以在JSON中使用[]包裹一个key的名字.此时这个key将用表达式作为属性名(被当做变量求值),这个key值必须是字符串. var a = 'name ...
- ES6 主要的新特性
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- ES6语法的新特性
ES6 就是ECMAScript 6是新版本JavaScript语言的标准.虽然目前已经更新到ES7,但是很多浏览器还不知处ES7语法,该标准仍在更新中,但目前部门网站都指出ES6的语法.目前ES6也 ...
- ES6的十个新特性
这里只讲 ES6比较突出的特性,因为只能挑出十个,所以其他特性请参考官方文档: /** * Created by zhangsong on 16/5/20. */// ***********Nu ...
- 深入浅出:了解JavaScript的ES6、ES7新特性
参照阮一峰博客:http://es6.ruanyifeng.com/#README es6常见题:https://blog.csdn.net/qq_39207948/article/details/8 ...
- [js高手之路] es6系列教程 - 新的类语法实战选项卡
其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法. 一.用es6封装一个基本的类 class Person{ constructor( ...
- ES6中常用新特性讲解
1.不一样的变量声明:const和let ES6推荐使用let声明局部变量,相比之前的var(无论声明在何处,都会被视为声明在函数的最顶部) let和var声明的区别: var x = '全局变量'; ...
- 003.ES2015和ES2016新特性--类.md
JavaScript使用的是基于原型的OO模型,用对象字面量或者函数来实例化对象,用原型链来实现继承. 这样对于数据传统C++.Java的OO范式的开发者来说,会感到比较困惑,于是从ES2015开始逐 ...
- 关于ES6的一些新特性的学习
一.关于变量 ES5 1.只有全局作用域变量和函数作用域变量 2.“变量提升”(当程序进入一个新的函数时,会将该函数中所有的变量的声明放在函数开始的位置.仅仅会提升变量的声明,不会提升变量的赋值) E ...
随机推荐
- Catalog
Java SE EE| Hibernate | Struts2Spring/SpringMVC | MyBatis C# Python PHP C/C++ | STL 汇编语言 ...
- js打断点
F12打开调试器 资源sources 找到就是文件 选中需要打断点的行 获得段短点的值:将断点向后执行一步(页面提示的桥状小图标),然后选中上一步需要打断点的值,悬浮在上 ...
- Hive数据倾斜解决方案
https://blog.csdn.net/yu0_zhang0/article/details/81776459 https://blog.csdn.net/lxpbs8851/article/de ...
- js数组中容易误用的一些方法
1.every和some 两个方法的参数都是一个函数,函数的有3个参数,依次是当前值value,索引index,数组array every判断数据中的每一项是否满足某个条件,如果满足就返回true,有 ...
- MySQL 游标(PREPARE预处理语句)
概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...
- 背水一战 Windows 10 (102) - 应用间通信: 剪切板
[源码下载] 背水一战 Windows 10 (102) - 应用间通信: 剪切板 作者:webabcd 介绍背水一战 Windows 10 之 应用间通信 剪切板 - 基础, 复制/粘贴 text ...
- react-native 项目初始化
react-native 项目初始化 搭建java,android,node环境 http://www.cnblogs.com/morang/p/react-native-java-build.htm ...
- itemKNN发展史----推荐系统的三篇重要的论文解读
itemKNN发展史----推荐系统的三篇重要的论文解读 本文用到的符号标识 1.Item-based CF 基本过程: 计算相似度矩阵 Cosine相似度 皮尔逊相似系数 参数聚合进行推荐 根据用户 ...
- Pycharm Debug调试心得
1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...
- Java与Python比较心得01
Java 可以int + 字符串(str)输出,python则只可以用逗号 , 连接,或者字符串 + 字符串或int + int否则python会报错如下图: