JS面向对象基础

74 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

1. 什么是对象,如何创建对象

1.1 什么是对象?

相信大家在学习JS之前应该是或多或少了解过面向对象语言,JS的对象和他们一样,是一个抽象的实体,而这个实体里面有这个对象的信息,和相关的行为,在对象中我们将信息抽象成数据,将行为抽象成函数(方法)。

好比一个人,人有姓名、年龄、性别等信息,同时具有吃饭、睡觉等行为,那人就是一个实体,我们将其抽象成对象,写成代码就如下:

var Person = {
    name : shea,
    age : 18,
    gender : female,
    eating : function(){
        alert("现在在吃饭");
    },
    sleeping : function(){
        alert("现在在睡觉")
    }
}

1.2 如何创建对象

上面我们创建了一个对象,那对象创建的规则是什么呢?

var objectName = {
  member1Name : member1Value,
  member2Name : member2Value,
  member3Name : member3Value
}

像上述person的中的name age gender eating sleeping 都是成员变量,而前面name age gender都是字面量,这种我们称作属性,后面两个函数我们称作方法

2. 如何访问对象的属性和方法

2.1 使用点访问

和Java一样,一个对象实体创建好以后,你要调用它的方法和属性,可以直接使用.来调用

基本规则就是对象名.属性或者方法名

如下

person.name
person.eating

想要看到效果可以写一段代码,然后在浏览器的控制台玩一下。

2.2 使用括号访问

还有一种访问方式是括号访问,就是将点后面的内容变成括号,颇有一番数组的风味

规则对象名['属性或方法名']

展示如下

person['name']
person['eating']

3. 类和构造函数

3.1 类的介绍和创建

说到面向对象编程,就不得不说到类和对象,上面对象以及讲完了,现在我们来讲讲类。

在学习java的时候,类和对象的区别就是,类将对象抽象了,而上面person的例子,我觉得更适合拿来当类,而不是对象。因为类是抽象,而对象是实体。就像人是一类生物,而你才是一个具体的人。你会说你要和Shea进行交流,而不是说我要和人类进行交流。

那这里我们就写一个Person类:

class Person{
    name;
    gender;
    age;
​
    constructor(name,gender,age){
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
​
    eating(){
        alert("现在在吃饭");
    }
​
    sleeping(){
        alert("现在在睡觉");
    }
}

3.2 构造函数

上面的类和对象不一样的点在于,对象中的name age gender这些属性都没有值。我们可以理解为class是女娲造人的模子,而每个人会有相同的地方,但是长相不同,而这个长相是怎么样的,就要看你出生长什么样子了,而这个时候就要看new 对象时候填入信息。

而这些信息填在哪里?就是在构造函数中。

所以在编写类的时候一定要记得编写构造函数!

构造函数和其他函数不一样,是使用constructor来标识。

4. 类的继承

4.1 什么是继承

讲到面向对象编程,那脱口而出的就是它的三个基本特征:封装、继承、多态,这小结我们先了解一下JS的继承

那生活在这个世界上的人呢,会有很多的职业,而这些职业之间的人拥有的技能是不一样的,比如有老师的职业,而他的技能就是教授某一门课程,比如医生的职业,而他的技能可能是内科,可能是外科,比如程序员也有前端后端之分。

而老师、医生、程序员这些都是人的职业,或者某一类人,那就可以从人这个十分抽象的类里面,再进行一次具体化的抽象,那就是老师、医生、程序员继承人类这个类。

而继承使用的关键字是extends如下:

class Programmer extends Person{
    
}

4.2 继承的代码编写

当我们写完上述代码以后,我们要继承Person原来拥有的属性和方法,使用的是super()函数,而且我们可以在这个基础上添加属于程序员专有的属性和方法,如下:

class Programmer extends Person{
    role;
    constructor(name,gender,age,role){
        super(name,gender,age);
        this.role = role;
    }
​
    eating(){
        alert("现在在吃饭");
    }
​
    sleeping(){
        alert("现在在睡觉");
    }
​
    coding(){
        alert("现在在写代码");
    }
}

5. 封装

封装最主要的就是我们有些值,是外界不能直接访问和修改的,这主要是为了数据的安全,这些属性和方法我们都称作私有方法和属性。

如何设定私有熟悉和方法呢?

直接在属性和方法前加一个#如下

class Programmer extends Person{
    #role;
    constructor(name,gender,age,role){
        super(name,gender,age);
        this.role = role;
    }
​
    eating(){
        alert("现在在吃饭");
    }
​
    sleeping(){
        alert("现在在睡觉");
    }
​
    #coding(){
        alert("现在在写代码");
    }
}