面向对象概念
面向对象是一种以对象为中心的编程思想。面向对象是相对于面向过程来讲的,面向对象把相关的数据 和方法组织为一个整体来看待,从更高的层次来进行系统建模。
面向过程
面向过程思想强调的是步骤,当碰见问题时,思考的是“我该怎么做”,分析出解决问题所需要的步骤, 一步步的去实现。 例如:想吃蛋炒饭,首先想到的是我要如何做,包括哪些步骤。比如:起锅烧油,加入鸡蛋,加入米 饭,加入调料,翻炒,装盘等。
面向对象
面向对象思想强调的是对象,当碰见问题时,思考的是“我该让谁来做”。这个“谁”其实就是对象。找合适 的对象做合适的事情。而对象如何去做(采用什么样的步骤)我们就不关心了,最终把问题解决掉就可以 了。 例如:还是想吃蛋炒饭,首先想到的是让谁来帮我做蛋炒饭,比如找厨师来帮我做蛋炒饭。具体厨师如 何去做这个蛋炒饭,做饭的步骤是怎么样的我们并不关心。只要最终把蛋炒饭做好就可以了。
遇到问题找对象,有对象就用对象,没有对象就创建对象来解决问题
在ES6中 我们通过类来创建对象 类其实是总和了 构造函数 和 原型
写法:
- //编写类
- class 类名{
- 属性名 = 属性值
- 方法名 = 函数
- ...
- }
- //通过类创建对象
- let 变量名 = new 类名()
在ES6中 类是专门用来创建对象的 相当于对象的模板
在ES6中 对象和类的关系是 类是对象的模板 对象是类的实例
- //在需要传参的时候 如果想让类 能够接收参数 需要单独编写类的构造器 constructor
- //写法如下
- class 类名{
- constructor(形参1,形参2,...){
- this.属性名1 = 形参1;
- this.属性名2 = 形参2;
- ...
- this.方法名 = function(){}
- }
- }
- //通过类创建对象
- let 变量名 = new 类名(实参1,实参2,...)
注意:通过构造器添加的属性和方法 都是直接绑定在实例对象自身上的
ES6中的类 存在一些特殊的属性和方法——静态属性 和 静态方法
这类方法和属性 只能由 类来使用 而不是 由实例对象来使用
写法如下
- class 类名{
- 属性名 = 属性值
- 方法名 = function(){}
- static 属性名1 = 属性值;//静态属性
- static 方法名1 = function(){};//静态方法
- }
:在es6中 如果子类 想 继承父类的属性和方法 可以通过一个关键字——extends
写法:
- //现在有一个现成的父类
- class Parent{
- name = "张三";
- age = 18;
- say = function(){
- console.log(this.name);
- }
- }
- //现在有一个子类 想继承父类中的属性和方法
- class 子类 extends 父类{}
- class Child extends Parent{
-
- }
:如果父类本身 需要传参 子类在继承的时候 除了使用extends关键字之外 还需要 使用一个函数——super
写法如下
- //现在有一个现成的父类
- class Parent{
- constructor(gender){
- this.gender = gender
- },
- name = "张三";
- age = 18;
- say = function(){
- console.log(this.name);
- }
- }
- //现在有一个子类 想继承父类中的所有属性 但是父类中gender属性需要传参
- class 子类 extends 要继承的父类{
- constructor(gender1){
- //在子类的constructor构造器的最开头 要先调用super方法 继承父类构造器中的属性和方法,并将实参 传入super函数中 通过super函数 将实参 传给父类
- super(gender1);
- }
- }
- let obj = new 子类("男")
说明:其实 调用super函数 相当于 调用继承的父类的构造器
super函数
super函数 可以帮助我们 继承到需要传参的父类中构造器中的属性和方法
super对象
super对象 则可以在子类中 帮助我们获取父类中的属性和方法(不包括普通属性)
- class Parent{
- 属性名 = 属性值//普通属性
- 方法名 = function(){}//普通方法
- static 属性名1 = 属性值;//静态属性
- static 方法名1 = function(){};//静态方法
- }
- class Child extends Parenr{
- //我们在子类中 可以通过super对象 使用父类中的普通方法 静态方法 和 静态属性 唯独不能使用 普通属性
- static 静态方法名(){
- console.log(super.父类静态属性名);
- super.父类静态方法名()
- }
-
- 普通方法(){
- super.父类普通方法名()
- }
- }
注意:子类中如果想使用父类的普通方法 也需要在普通方法中使用
总结
面向对象 在实际开发中 用的不多 我们实际开发中 用的更多的是 面向过程思想
面向对象更多的使用在 框架的开发中,例如
- 数组的方法 Array.of Array.from 数组.find 数组.findIndex
- class Array1 {
- static of(){};
- static from(){};
- find(参数){
-
- };
- findIndex(){
-
- }
- }