7.面向对象

JavaScript是一种面向对象的语言

面向过程是按照步骤一个个调用函数,实现某一件事情。

面向对象是把事件分为一个个对象对象之间合作分工完成一键事情。

面向对象的特性是

1.封装

2.继承

3.多态

举个例子  

一个人就是一个对象,每个对象都有一个名字,年龄,身份证号码,我们把这些内容都保存起来做成身份证,就是Person类(人类)封装,

父亲有身份证,儿子也要有身份证,就是继承,儿子(子函数)可以有父亲(父函数)的方法和属性,

同样是人,有的人会跳舞,有的人会打王者荣耀,就是多态

对象实例化时可以每个人都创建一个对象

var fu = {
        age:"23",
        gender:"man"
    }
var wang = {
        age:"26",
        gender:"man"
    }

写好了,但是我们不禁想起,每个对象之间似乎没有任何联系,而且100人要写100次

于是我们创建一个函数,

function Person(age,gender){
        return{
            age:age,
            gender:gender,
        }
    }
    fu = Person("19","man")
    console.log(fu.gender);

每次我们要创建实例的时候只需要调用一次函数就可以了

但是问题又来了,这样写似乎不太行如果我们要修改age,想让age等于10年后的自己怎么办呢

于是我们修改函数

function Person(age,gender){
        obj = {}
        obj.age = age
        obj.gender = gender
        return obj
    }
    fu = Person("19","man")
    console.log(fu.age);

解决问题,完美收工,唉!每次想获取属性还需要return一下非常不方便,于是我们再次更改,使用构造函数模式

function Person(age,gender){
        this.age = age;
        this.gender = gender
    }
    fu = new Person("23","man")
    console.log(fu.age);

我们使用this替代object传参模式,这样不用return参数就能获得创建的实例fu的所有属性

注:

1.创建实例的时候必须要new一下

2.在实例化之前的this是指向window 在实例化之后的this是指向构造函数

3.构造函数写法是首字母大写(想咋写咋写嘛看得懂就行)

父亲有一块玉佩,儿子想用可以使用,这就是原型链,如果追溯到这块玉佩的使用权,那么就是父亲,大儿子要用这块玉佩,二儿子也要用这块玉佩,他们使用的是同一块那么就不需要一遍遍的重新定义

我们就可以把他定义在prototype上面,既实例化函数原型

function Person(age,gender){
        this.age = age;
        this.gender = gender
    }
    Person.prototype.something = "玉佩"
    fu = new Person("23","man")
    console.log(fu.something);

父亲想要用这块玉佩需要调用

Person.prototype.something // 玉佩
父亲有一套房子,儿子是得不到的所以需要父亲选择把房子继承给谁,
于是 
function father(){
        this.jiachan = "房子" // 父亲有一套房子
    }
    function son(){
        father.call(this) // 父亲告诉儿子你继承我的房子方式1
        father.apply(this) // 父亲告诉儿子你继承我的房子方式2
    }
    fu = new son()
    console.log(fu.jiachan);

在函数中的解释就是改变this的指向,劫持别人的this

那么call 和 apply 有什么区别呢 

其实就是传参的方式

Person.call(obj,age,gender)  传参方式为第一个对象(劫匪) 第二个为参数 第三个第四个为参数

person.apply(obj,[age,gender]) 传参方式为第一个对象(劫匪) 第二个为含参数组

PS:本博客为记录学习时使用 不代表任何立场

如有问题欢迎各位大佬指出

QQ:1759435876 微信、邮箱同号

 

7.面向对象

上一篇:CMake使用入门


下一篇:git 拿远程仓库的代码