今后程序中,先使用一个个的对象结构集中存储现实中事物的属性和功能。然后,再按需使用不同对象中的不同属性和功能。这就是面向对象编程。
面向对象的优点: 极其便于大量数据的管理维护。
面向对象的特点: 封装、继承、多态
封装
封装就是创建一个对象,集中保存现实中一个事物的属性和功能。将零散的数据封装进对象结构中,极其便于大量数据的管理维护。只要使用面向对象思想开发时,第一步都是先封装各种各样的对象结构备用。
封装对象方式一:直接定义{}的方式
如:var 对象名={ //new Object()的简写 属性名: 属性值, 方法名: function(){ ... } }
访问对象中的属性和方法:对象名.属性名或对象名[属性名],对象名.方法名
问题:
在对象自己的方法内,想使用当前对象自己的属性时,竟然报错:xxx属性名 is not defined——未定义!
解决:使用this访问当前对象自己的属性
this是指:每个函数内自带的专门指向正在调用当前函数的.前的对象的关键字
总结:对象中的方法中,只要想使用当前对象自己的属性或其他方法时,都要加this
封装对象方式二:用 new Object()
var 对象名=new Object(); //先创建空对象{}
//强行给空对象中添加新属性和新方法
对象名.新属性=属性值;
对象名.新方法=function(){ ... this.属性名 ... }
封装对象方式三:使用构造函数
因为,用{}一次只能创建一个对象。如果想创建多个相同结构的对象时,代码就会很多重复!极其不便于将来的维护。 所以,只要想反复创建多个相同结构,只是内容不同的对象时,都用构造函数。
定义构造函数:
function 类型名(形参1, 形参2, ...){
//将来要加入到新对象中的规定的属性
this.属性名=形参1;
this. xxx = xxx;
this.方法名=function(){ ... this.属性名 ... }
}
使用构造函数:
var 对象名=new 类型名(实参值1, 实参值2, ...)
继承
只要将方法定义放在构造函数中,那么,每次new时都会执行function, • 就会反复创建相同函数的多个副本!浪费内存,可以用继承的方式解决。
什么是继承:父对象中的成员,子对象无需重复创建,就可直接使用!就像使用自己的成员一样!
js中继承都是通过原型对象实现
原型对象:替所有子对象集中保存共有属性值和方法的父对象。
只要发现多个子对象都需要使用相同的功能和属性值时,都可将相同的功能和属性值集中定义在原型对象中。
原型对象不用自己创建,而是在定义构造函数时,程序自动附赠我们一个空的原型对象。
如何找到原型对象: 构造函数中都有一个自带的属性prototype,指向自己配对的原型对象。 构造函数.prototype。
如何使用原型对象继承: new的时候自动让新创建的子对象,继承构造函数的原型对象。自动设置子对象的_ proto _属性,指向构造函数的原型对象。
如何向原型对象中添加共有属性或方法:
构造函数.prototype.属性名=属性值
构造函数.prototype.方法名=function(){… …}
总结:new 所做的四步
- 创建一个新的空对象等待
- 让子对象继承构造函数的原型对象
- 调用构造函数,将this替换为新对象,通过强行赋值方式为新对象添加规定的属性
- 返回新对象地址 今后,用子对象.访问任何成员时,js引擎先在子对象内部查找自有的属性。如果子对象没有,则js引擎会自动延_ proto _属性去父对象查找。如果在父对象中找到了想要的属性或方法,则和访问子对象的方法一样调用。
多态
同一个函数在不同情况下表现出不同的状态称为多态。
重载overload: 同一个函数,输入不同的参数,执行不同的逻辑
重写override: (推翻、遮挡)
从父对象继承来的个别成员不好用时,就可以在子对象中定义同名成员,来覆盖父对象中的同名成员。
如:数组家的原型对象爸爸觉得Object爷爷家的toString不好用!于是就自己重写了一个好用的同名的toString()方法。
问题:Student家的孩子也想用好用的toString()
解决:重写
Student家的原型对象爸爸,也重写一个新的好用的toString()方法,给Student家的子对象孩子们使用
function Student(sname,sage){
this.sname=sname;
this.sage=sage; }
//向Student的原型对象中添加一个好用的toString方法
Student.prototype.toString=function(){
return `{ sname:${this.sname}, sage:${this.sage} }`
}
总结:
- 封装: 创建对象,2种: 如果只创建一个对象: {}如果反复创建多个相同结构的对象: 构造函数
- 继承: 所有子对象共用的属性值和方法,都要放在构造函数的原型对象中
- 多态: 重写: 只要觉得从父对象继承来的成员不要用,都在子对象中重写同名成员