javascript面向对象思想

一、什么是面向对象

  • 什么是对象

    • 生活中有很多对象

    • 手机:手机有自己的颜色、可以打电话、听音乐等,我们并不知道手机内部的工作原理,

    • 在我们不了解某个东西内部原理的情况下,就能使用,这就是面向对象的思想

二、面向对象的思想

  • 抽象

    • 员工管理系统

    • 抽取自己需要的特征的过程就是抽象

  • 封装

    • 可以将封装理解为:看不到内部的东西,用好表面的功能就可以了

  • 继承

  • 多态

  • JavaScript是面向对象的弱语言

    • js中只有对象,没有类,其面向对象的思想是基于对象实现的

    • 在js中,一切皆对象

三、面向过程和面向对象的理解

  • 案例:把大象装进冰箱

    • 面向对象的编程方式:

      • 冰箱.开门()

      • 冰箱.装进(大象)

      • 冰箱.关门()

    • 面向过程的编程方式:

      • 开门(冰箱)

      • 装进(冰箱,大象)

      • 关门(冰箱)

  • 面向过程以动词为主,完成一个事件就是把不同的函数按照顺序调用

  • 面向对象以主语为主,将主语看成一个一个的对象,对象有自己的属性和方法

四、类和对象

//属性:某类事物拥有的静态的东西,比如人的姓名、性别
let a = 12;//变量,自由的变量,不属于任何对象
let arr = [1, 2, 3, 4, 5];
arr.a = 12 ;//我们可以给数组添加一个属性,这个属性不是自由的,是属于数组的
console.log(arr.a);//其实属性和变量是一个东西
​
//方法:某类事物能干什么(动作、功能、行为)
function show() {//自由的,不属于谁
    console.log("hello")
}
//调用
show();
//给数组添加方法
arr.show = function () {// 方法,属于arr这个对象的行为
    console.log(arr.a);
}
arr.show();

五、this的本质

  • this:this用在方法中,这个方法属于谁,this就是谁

  • 全局函数或全局变量属于window对象

六、JavaScript中的数据类型

  • 任何一个JavaScript的标识、变量、常量和参数都是number、string、boolean、undefined、object、function类型中的一种,也就是typeof返回的类型

七、第一个面向对象的程序

  • 为对象添加属性和方法

    • 原则:不能在系统对象中随意添加属性和方法,否则会覆盖已有的,同时也不灵活

  • Object:

    • 之前接触过很多对象:

      • 比如Date、Array,这些对象都有自己特有的功能

    • Object是一个空白对象,没有功能,所以实现面向对象思想时,多用它

      let obj = new Object();//创建一个空白对象
      obj.name = "刘备";//给对象添加属性
      obj.tel = "12345678901";
      obj.showName = function () {//给对象添加方法
          console.log("我的姓名是:" + this.name);
      }
      obj.showTel = function () {
          console.log("手机号是:" + this.tel);
      }
      ​
      let tel = new Object();
      tel.trademark = "华为";
      tel.color = "白色";
      tel.call = function () {
          console.log("手机拨打电话....")
      };
      tel.showTrade = function () {
          console.log("手机的品牌是:" + this.trademark)
      }
      tel.showTrade();
      tel.call()
      //调用方法
      obj.showName();
      obj.showTel();

八、利用构造函数创造对象

//创建一个方法,专门用来创建对象
function createUser(name,tel) {
    let obj = new Object();
    obj.name = name;
    obj.tel = tel;
    obj.showName = function () {
        console.log("姓名是:" + this.name);
    };
    obj.showTel = function () {
        console.log("手机号是:" + this.tel);
    };
    return obj;
}
​
//创建了一个对象
let obj1 = createUser("刘备","123");
obj1.showName();
obj1.showTel();
//创建第二个对象
let obj2 = createUser("关羽","234");
obj2.showName();
obj2.showTel();
  • 用来创建对象的函数,称为构造函数

九、工厂模式

  • 什么是工厂:

    • 批量生产东西的地方

    • 生产一个东西的步骤

      • 原料

      • 加工

      • 出厂

/
/创建一个方法,专门用来创建对象
//利用构造方法创建对象的方式类似工厂的生产过程,所以称为工厂模式
function createUser(name,tel) {
    //1.创建空白对象就是原料
    let obj = new Object();
    //2.添加属性和方法就是加工
    obj.name = name;
    obj.tel = tel;
    obj.showName = function () {
        console.log("姓名是:" + this.name);
    };
    obj.showTel = function () {
        console.log("手机号是:" + this.tel);
    };
    //3.返回加工好的对象就是出厂
    return obj;
}
  • 用this和new改造代码

    //创建一个方法,专门用来创建对象
    //利用构造方法创建对象的方式类似工厂的生产过程,所以称为工厂模式
    //构造方法要求首字母大写,通过new调用
    function CreateUser(name,tel) {
        //1.系统会偷偷的帮我们创建一个交this的空对象
        //let this = new Object();
        //2.添加属性和方法就是加工
        this.name = name;
        this.tel = tel;
        this.showName = function () {
            console.log("姓名是:" + this.name);
        };
        this.showTel = function () {
            console.log("手机号是:" + this.tel);
        };
        //3.系统会偷偷的帮我们将this返回出去
        //return this;
    }
    ​
    //创建了一个对象
    let obj1 = new CreateUser("刘备","123");
    obj1.showName();
    obj1.showTel();
    //创建第二个对象
    let obj2 = new CreateUser("关羽","234");
    obj2.showName();
    obj2.showTel();

十、原型

  • 之前创建对象的方式,存在函数重复,资源浪费的现象

  • alert(obj1.showName == obj2.showName) //false
    • 说明内存中存放了两个这样的函数,如果创建了1000个对象,这样的代码重复1000份,资源浪费严重

  • 利用原型解决这个问题

    function CreateUser(name,tel) {
        //构造方法中给属性赋值
        this.name = name;
        this.tel = tel;
    }
    CreateUser.prototype.showName = function () {
        console.log("姓名是:" + this.name);
    };
    CreateUser.prototype.showTel = function () {
        console.log("手机号是:" + this.tel);
    }
    ​
    //创建了一个对象
    let obj1 = new CreateUser("刘备","123");
    obj1.showName();
    obj1.showTel();
    //创建第二个对象
    let obj2 = new CreateUser("关羽","234");
    obj2.showName();
    obj2.showTel();
    //所有对象的原型只有一份,利用原型:在构造方法中写属性,给原型添加方法
    alert(obj1.showName == obj2.showName)//true
    //new Array()
    let arr1 = [1, 2, 3, 4 ,5];
    let arr2 = [2, 4, 6, 8, 10];
    //给arr1添加了一个求和的方法
    /*arr1.sum = function () {
        let num = 0;
        for (let i = 0; i < this.length; i++) {
            num += this[i];
        }
        return num;
    };*/
    //利用原型给数组添加一个求和的方法,所有的数组对象都可以使用
    Array.prototype.sum = function () {
        let num = 0;
        for (let i = 0; i < this.length; i++) {
            num += this[i];
        }
        return num;
    };
    console.log(arr1.sum());
    console.log(arr2.sum());

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值