这里写目录标题
- [一、class 类的用法](#一、class 类的用法)
- 二、类的继承
一、class 类的用法
JS语言中,生成实例对象的传统方法是通过构造函数:
js
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayName=function(){
return this.name
}
let p=new Person('小马哥',18);
console.log(p);//Person {name: '小马哥', age: 18}
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样
js
class Person{
// constructor方法 是类的默认方法,通过new命令生成对象实例时,自动调用该方法,一个类必须有constructor方法,如果没有定义,会被默认添加
constructor(name, age) {
this.name = name;
this.age = age;
}
//等同于Person.prototype = function sayName(){}
sayName(){
return this.name;
}
}
console.log(new Person('小马哥',18));
类的方法内部如果含有this,它默认指向类的实例.
二、类的继承
js
class Animal{
// 实例化的时候会立即被调用
constructor(name, age){
this.name = name;
this.age = age;
}
setName(){
return this.name;
}
setAge(){
return this.age;
}
}
class Dog extends Animal{
constructor(name, age, color){
// 如果 子类 继承了 父类,且 子类 中写了构造器,则 子类 构造器的 super 必须要调用
super(name, age); // 等同于 Animal.call(this,name,age); 继承父类的属性
this.color = color;
}
// 子类自己的方法
setColor(){
return `${this.name}是${this.age}岁了,它的颜色是${this.color}`;
}
// 重写父类的方法
setName(){
// super 相同于 Animal
return this.name + super.setAge() + this.color;
}
}
let d1 = new Dog('小黄', 28, 'red');
console.log(d1.setAge()); // 调用继承父类的方法
console.log(d1.setColor()); // 调用子类自己的方法
console.log(d1.setName()); // 调用重写父类的方法