web思维进阶 & 面向对象

92 阅读3分钟

知识点概要

  • 对象的创建
  • 工厂模式
  • new运算符
  • 构造函数
  • 原型prototype
  • 原型链
  • 构造函数继承
  • 原型的继承
  • 包装对象
  • 面向对象和面向过程编程
  • 类和对象概念

序:面向对象编程思想

1、面向过程:注重解决问题的步骤,分析问题需要的每一步,实现函数的依次调用

2、面向对象:是一种程序设计思想,将数据和处理数据的程序封装到对象中

3、面向对象特性:抽象、继承、封装、多态

优点:提高代码复用性及可维护性

一、对象的创建

//对象创建
//1. 字面量
const obj = {
    name:"zhangsan",
    age:20
}

//2. 构造函数
const obj = new Object();
obj.name = "zhangsan";

//3. Object.create 属性和方法会被创建到原型上
const obj = Object.create({
     name:"zhangsan",
     age:20
})

二、工厂模式

//提高代码的复用性,减少代码冗余
function Person(name,age){
    let obj = {}
    obj.name = name;
    obj.age = age;
    return obj
}
const zhangsan = Person("张三"20)
const lisi = Person("李四"20)

三、new运算符

  • 执行函数
  • 创建对象
  • 绑定this
  • 隐式返还this

四、构造函数

//使用new运算符将工厂模式函数改造为一个构造函数
//1. 首字母大写
//2. this指向实例化对象
function Person(name,age){
    this.name = name;
    this.age = age;
}
const zhangsan = new Person("张三"20)

五、原型prototype

  • ES5中构造函数由两部分构成:
    • 1.自身的属性及方法
    • 2.原型prototype
  • 原型prototype中存在一个固有属性constructor属性指向构造函数本身
  • 构造函数通过new实例化之后自身的属性及方法会指向实例化出来的对象,而原型中的属性和方法会指向实例化对象中__proto__
  • __proto__与prototype在内存中是同一个地址,只是表现形式不同

六、原型链

  • 当访问一个对象的属性或方法时,会先在对象自身上查找属性或者方法是否存在,如果存在就使用对象自身的属性和方法,如果不存在就去创建对象的构造函数的原型对象中查找,依此类推,直到找到为止,如果到顶层对象中还找不到,则返回undefined。
  • 原型链最顶层为Object构造函数的原型对象,给Object.prototype添加属性或方法可以被除null和undefined之外的所有数据类型对象使用。

七、构造函数继承

  • call、apply、bind
function foo(){
    console.log(this)
    //非严格模式下默认指向window
}
let obj = {
    name:"张三"
}
foo.call(obj,args,args...)//改变this指向
foo.apply(obj,[...args])
foo.bind(obj)(args,args...)
  • 应用到构造函数继承
function Dad(){
    this.moeny = 1000000000
}
function Son(){
    Dad.call(this)
}

八、原型的继承

function Dad(){
    this.moeny = 1000000000
}
Dad.prototype.fn = function(){
    console.log("fn")
}

function Son(){
    Dad.call(this)
}
Son.prototype = deepCopy(Dad.prototype)
//使用深拷贝解决复杂数据类型的传址问题来实现原型的继承

const Link = function(){}
Link.prototype = Dad.prototype;
Son.prototype = new Link();//会覆盖掉Son原型中constructor
Son.prototype.constructor = Son//重新指回constructor指向
//使用组合继承实现原型的继承