什么是面向对象
就是把客观对象抽象成属性数据和对数据的相关操作,把内部细节和不想关的信息隐藏起来,把同一个类型的客观对象的属性数据和操作绑定在一起,封装成类,并且允许分成不同层次进行抽象,通过继承实现属性和操作的共享。
-
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
-
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象有三大特征:封装、继承、多态。
1.封装
封装就是对象内部的变化对外界是透明的,不可见的。使用封装,可以达到代码的复用,使代码更加简洁,不会重复写很多的代码,减少代码冗余。
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
showInfo(){
console.log("我叫" + this.name + ",今年" + this.age + "岁。");
}
}
let p1 = new Person("小红", 18);
p1.showInfo(); //我叫小红,今年18岁。
let p2 = new Person("小蓝", 17);
p2.showInfo(); //我叫小蓝,今年17岁。
2.继承
继承可以使得子类具有父类的各种的公有属性和公有方法。而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
class Father{
constructor(name){
this.name = name;
}
asset(){
console.log("我家有台40寸电视机");
}
getName(){
console.log("我是"+this.name);
}
// 静态方法不会被继承
static personal(){
console.log("我不用上学");
}
}
class son extends Father{
constructor(name,age){
super(name);
this.age = age;
}
getAge(){
console.log("我今年"+this.age+"岁");
}
}
let s = new son("儿子",19);
//继承之后可以调用父类的方法
s.getName();//我是儿子
s.asset();//我家有台40寸电视机
//子类的方法
s.getAge(); //我今年19岁
//静态方法不会被继承
s.personal(); // s.personal is not a function 报错没有这个方法
3.多态
多态就是相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。多态的具体表现为方法重载和方法重写
下面在添加一个增加task的方法重写。
class Father{
constructor(name){
this.name = name;
}
asset(){
console.log("我家有台40寸电视机");
}
getName(){
console.log("我是"+this.name);
}
// 静态方法不会被继承
static personal(){
console.log("我不用上学");
}
task(){
console.log("我的任务是上班赚钱");
}
}
class son extends Father{
constructor(name,age){
super(name);
this.age = age;
}
getAge(){
console.log("我今年"+this.age+"岁");
}
// 重写方法
task(){
console.log("我的任务是好好学习");
}
}
let f = new Father("父亲");
f.getName(); //我是父亲
f.task(); //我的任务是上班赚钱
let s = new son("儿子",19);
s.getName();//我是儿子
//因为重写了方法,由“我的任务是上班赚钱”,变成了“我的任务是好好学习”。
s.task(); //我的任务是好好学习
三大特征的优点:
封装:封装的优势在于定义只可以在类内部进行对属性的操作,外部无法对这些属性修改,只能通过你定义的封装方法;
继承:继承减少了代码的冗余,省略了很多重复代码,开发者可以从父类底层定义所有子类必须有的属性和方法,以达到耦合的目的;
多态:多态实现了方法的个性化,不同的子类根据具体状况可以实现不同的方法.