编程思想
面向过程
面向过程
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个一个调用
面向对象
面向对象(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非标准属性
原型继承
继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,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)