面向对象编程(OPP)

作者:狐狸家的鱼

本文链接:面向对象编程

GitHub:sueRimn

面向对象编程(OPP)

具有灵活、代码可复用、高度模块化等特点,易维护和开发

实例对象与new命令

1.对象

  • 对象是单个实物的抽象
  • 对象是一个容器,封装了属性(prototype)和方法(method)
    • 属性是对象的状态
    • 方法是对象的行为

2.构造函数

JavaScript使用构造函数作为对象的模板,描述实例对象的基本结构

定义

  • 专门用来生成实例对象的函数
  • 第一个字母通常大写

特点

  • 函数体内部使用了this关键字,代表所要生成的对象实例
  • 生成对象的时候,必须使用new命令

3.new命令

基本用法

  • new命令的作用就是执行构造函数,返回一个实例对象

  • 根据需要,构造函数也可以接受参数 原理

  • 使用new命令时,它后面的函数依次执行下面的步骤

    • 1.创建一个空对象,作为将要返回的对象实例
    • 2.将这个空对象的原型,指向构造函数的prototype属性
    • 3.将这个空对象赋值给函数内部的this关键字
    • 4.开始执行构造函数内部的代码
  • 构造函数内部,this指的是一个新生成的空对象 new.target

    如果当前函数是new命令调用,new.target指向当前函数,否则为undefined

4.this关键字

涵义

  • 可以用在构造函数中,表示实例对象
  • 它总是返回一个对象
  • this就是属性或方法“当前”所在的对象
  • 由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的

使用场合

  • 全局环境:this指的就是顶层对象window
  • 构造函数:this指的是实例对象
  • 对象的方法:this指的就是方法运行时所在的对象

使用注意点

  • 避免多层this
    • 解决方法:使用一个固定this的值,然后内层函数调用这个变量 var that = this
  • 避免数组处理方法中的this
    • 数组的mapforEach方法,运行提供一个函数作为参数。这个函数内部不应该使用this
    • 解决方法
      • 1.var that = this
      • 2.将this当作forEach方法的第二个参数,固定它的运行环境
  • 避免回调函数中的this

绑定this的方法

  • Function.prototype.call()
    • 可以指定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域内,调用该函数
    • call方法的参数,应该是一个对象。如果参数为空、nullundefined,则默认传入全局对象
    • call方法可以接受多个参数。第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需的参数
  • Function.prototype.apply()
    • 它与call的唯一区别就是,它接收一个数组作为函数执行时的参数
    • apply方法的第一个参数也是this所要指向的那个对象,如果设为nullundefined,则等同于指定全局对象
    • 第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数
    • 原函数的参数,在call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加
    • 应用
      • 1.找出数组的最大元素:结合使用apply方法和Math.max方法
      • 2.将数组的空元素变为undefined
      • 3.转换类似数组的对象:利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组
      • 4.绑定回调函数的对象
  • Function.prototype.bind()
    • 用于将函数体内的this绑定到某个对象,然后返回一个新函数
    • 使用注意点
      • 1.每一次返回一个新函数
      • 2.结合回调函数使用
      • 3.结合call方法使用

5.对象的继承

原型对象

构造函数的缺点是同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。解决方法:使用prototype

prototype属性的作用就是:JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享原型对象的作用就是定义所有实例对象共享的属性和方法

原型链

由于原型对象也是对象,所以它也有自己的原型,对象到原型,再到原型的原型……

  • 所有对象都继承了Object.prototype的属性
  • Object.prototype的原型是null,原型链的尽头就是null
  • Object.getPrototypeOf方法返回参数对象的原型

constructor属性

prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数,可以被所有实例对象继承

posted @ 2019-03-19 19:24  狐狸家的鱼  阅读(586)  评论(0编辑  收藏  举报