面向对象(笔记)

96 阅读2分钟

编程思想

面向过程

面向过程

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个一个调用

面向对象

面向对象(oop)

面向对象是把事务分解成一个个对象,然后对象之间分工合作

面向对象的继承性 封装性 多态性

面向过程面向对象
优点性能好灵活,代码可复用,容易维护和开发
缺点没有面向对象以维护,易复用,易扩展性能不好

构造函数

封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现封装

构造函数创建出来的实例之间彼此不影响

构造函数体现了面向对象的封装特性

构造函数存在浪费内存的问题

js实现面向对象需要借助构造函数来实现

funciton Person(uname,age){
 this.uname=uname
 this.age=age
 this.gender=function(){
 console.log('女性')
}
}
//实例对象,获得了构造函数中封装的所有逻辑
const li=new Person('李华',12)

原型

原型

构造函数通过原型分配的函数是所有对象所共享的

每个构造函数都有一个prototype属性(原型对象)

构造函数和原型对象中的this都指向实例化的对象

原型的作用:

共享方法

可以把那些不变的方法,直接定义在prototype对象

练习:给数组扩展方法

1.给数组扩展最大值方法和求和方法

arr.reverse() 反转数组

arr.sum() 求和

原型对象方法:

Array.prototype.max=function(){
 //this指向函数的调用者
 return Math.max(...this)
 }
 console.log([1,2,3].max())
Array.prototype.sum=function(){
    return this.reduce((prev,item)=>prev+item,0)
    }
        console.log([1,2,3].sum())

constructor属性

每个原型对象里面都有一个construct属性

使用场景:

如果有多个对象的方法,可以给原型对象采取对象采取对象形式赋值

function Person(name) {
  this.name = name
}
Person.prototype = {
//手动利用constructor指向Person构造函数
  gender: function () { console.log('女') }
}
console.log(Person.prototype.constructor)//指向object

对象原型

对象都有一个属性__proto__ 指向 构造函数的prototype原型对象

__proto__是js非标准属性

image.png

原型继承

继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,js中大多是借助原型对象实现继承的特性

一般公共属性写到构造函数内部,公共方法,挂载到构造函数原型身上

function Man() {

}
//用new Person() 替换刚才的固定对象
Man.prototype = new Person()
//让原型里面的constructor重新指向Man
Man.prototype.constructor = Man
const li = new Man()
Man.prototype.smoking = () => { }
console.log(li);

function Woman() {
  this.baby = function () { }
}
// 用new Person() 替换刚才的固定对象
Woman.prototype = new Person()
Woman.prototype.constructor = Woman
const wang = new Woman()
console.log(wang)

原型链

image.png