es6基础:类、继承、重写
es6真正的引入的面相对象的类,以前我们总是通过其他手段来模拟类这种形式,现在终于有了,我有点开心,又有点难过,因为在我看来,js并不是所谓的面相对象的语言,反而更偏向函数式,原型继承是他真正的面目。面相对象不过是人们在思考问题时总结出一套有效的、大家都认同的解决问题的思路。在其他语言、各种领域取得成功之后,又将这种思想带入js中,为的是将已有的经验可以复用到js,从而更有效的解决js中的问题。
的确,面相对象是一个很有用的思考模块,在分解真实世界、大型项目的维护上有很大的好处,但是却缺少了函数式的灵巧。曾经想用完全面向对象的方式写一个redux,却发现无法用这种方式写出compose这种神奇的东西。
或许是我还没能在面相对象和函数式之间取得一种平衡,以取得面相对象和函数式共同的优点。
0x001 类
普通的类
普通的类
class Person{}类表达式
// 匿名类
let Person=class{}
// 具名类
let Person=class Person{}
0x001 初始化类和构造函数
   实例化类
    可以使用new来调用一个类,从而实例化一个类实例
class Person{}
new Person() // Person{}构造函数
使用new实例化一个类实例之后,将会自动调用该类的构造函数constructor,并且可以传递参数class Person{
constructor(name, age){
console.log(name, age)
}
}
new Person("jack", 23) // 'jack', 23类变量
类中可以保存一些变量,在类中,可以通过this.variable_name来访问,在类外,可以通过instance_name.variable_name只有类实例可以访问他们,并且每个类实例的变量都是属于每个类实例的。class Person {
constructor(nickname, age){
this.nickname = nickname
this.age = age
}
}
console.log(Person.nickname) // undefined
console.log(Person.age) // undefined let person=new Person("jack",23)
console.log(person.nickname) // 'jack'
console.log(person.age) // let person2=new Person("maria",11)
console.log(person2.nickname) // 'maria'
console.log(person2.age) //类方法
类方法是定义在类内部的函数,可以在类内部调用:this.function_name(params),也可以在实例上调用:instance_name.function_name(params)class Person{
constructor(nickname, age){
this.nickname = nickname
this.age =age
}
getNickname(){
return this.nickname
}
getAge(){
return this.age
}
summary(){
return `${this.nickname}:${this.age}`
}
}
let person=new Person('jack', 23)
console.log(person.getNickname()) // ''jack
console.log(person.getAge()) //
console.log(person.summary()) // 'jack:23'静态方法
静态方法是可以通过类直接调用的方法,不需要实例化class Person{
static sayHello(){
console.log('hello')
}
}
Person.sayHello() // 'hello'继承
继承就是将父类所有的方法和都继承下来,包括构造函数
class Person{
constructor(nickname, age){
this.nickname = nickname
this.age =age
}
getNickname(){
return this.nickname
}
getAge(){
return this.age
}
summary(){
return 'this is Person'
}
}
class Male extends Person {}
let male=new Male('jack',23)
console.log(male.nickname) // 'jack'
console.log(male.age) //
console.log(male.getNickname()) // 'jack'
console.log(male.getAge()) //
console.log(male.summary()) // 'this is Person'class Far {
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x + this.y);
}
} class Jc extends Far {
constructor(x, y) {
super(x, y);
}
} new Jc(1, 2).sum();0x003 重写
有时候我们不希望一个函数的作用和父类一致,比如在上面的栗子中,
male.summary()返回this is Person,不符合我们的逾期,我们希望返回this is Male,这个时候就可以用到重写,只要写一个和父类相同名字和函数就行了,甚至参数个数不一致也不影响class Person{
constructor(nickname, age){
this.nickname = nickname
this.age =age
}
getNickname(){
return this.nickname
}
getAge(){
return this.age
}
summary(){
return 'this is Person'
}
}
class Male extends Person {
summary(){
return 'this is Male'
}
}
let male=new Male()
console.log(male.summary()) // this is Male
es6基础:类、继承、重写的更多相关文章
- C++基础——类继承中方法重载
		
一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...
 - ES6——class类继承(读书笔记)
		
前言 我一定是一个傻子,昨天这篇文章其实我已经写好了一半了,但是我没有保存 这是学习ES6的过程,我没有系统的看完阮大大的书.零零散散的,很多功能知道,但是没有实际的用过 看了几遍,总是看前面几章,所 ...
 - C++基础——类继承
		
一.前言 好吧,本系列博客已经变成了<C++ Primer Plus>的读书笔记,尴尬.在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现 ...
 - java基础 类 & 继承
		
类 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在 ...
 - 深入解析ES6 更易于继承的类语法的使用
		
和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...
 - 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法
		
实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...
 - Python基础(十一) 类继承
		
类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...
 - C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
		
C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...
 - ES6中的类继承和ES5中的继承模式详解
		
1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...
 - 创建线程的一般方式和匿名内部类方式对比——继承thread类,重写run()方法
		
第一种:继承thread类,重写run()方法 一般方式:Demo01.java /** * 创建线程的第一种方式:继承thread类,重写run()方法 * * @author :liuqi * @ ...
 
随机推荐
- 震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
			
这里还有数据库相关的优质文章:快戳我,快戳我
 - 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
			
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
 - 自动化API之一 生成开源ERP Odoo App 的RestFul API
			
1.在服务器上安装开源ERP Odoo 安装步骤请自行百度,本文重点不在于指导安装,以下是安装后PC端效果. Odoo: 2.在Uniconnector平台上注册Odoo App 移动端应用 3.配置 ...
 - 使用python实现模拟掷骰子数据分析
			
Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...
 - django 整理数据库文档时,从mysql导出的表中没有注释的解决方案
			
公司要将Django项目重构成Java项目,也就有了整理数据库文档的经历....... 由于django从model迁移时没有将注释(也就是模型类中的verbose_name)写进mysql的表中,导 ...
 - JUC之CAS
			
CAS(全称为CompareAndSwap,也有说是CompareAndSet,都差不多)是一条CPU并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,判断预期值和更改新值的 ...
 - (三)Redis &分布式锁
			
1 Redis使用中的常见问题和解决办法 1.1 缓存穿透 定义:缓存系统都是按照key去缓存查询,如果不存在对应的value,就应该去DB查找.一些恶意的请求会故意查询不存在的key,请求量很大,就 ...
 - LeetCode--Jewels and Stones && Range Sum of BST (Easy)
			
771. Jewels and Stones (Easy)# You're given strings J representing the types of stones that are jewe ...
 - 图形学_Bezier曲线
			
Bezier曲线由n个控制点生成,举个例子:当n=2时,点$P_0$.$P_1$之间遵从计算: $P_0=(1-t)P_0+tP_1$ 而推广为n维时,有: $P^n_0=(1-t)P^{n-1}_0 ...
 - Pytest 单元测试框架
			
1.pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效 2.安装 pytest pip install pytest 3.验证 pytest 是否安装成功 p ...