首页 > 代码库 > JavaScript笔记(七)

JavaScript笔记(七)

面向对象

对象: 1.描述现实中一个具体事物的属性和功能的程序结构
事物的属性会成为对象的属性
事物的功能会成为对象的方法
2. 内存中同时存储多个数据和方法的一块存储空间。
面向对象: 在程序中,都是先用对象封装一个事物的属性和功能。然后,再调用对象的方法,来执行任务。
为什么: 符合人日常的习惯。


如何使用: 2步:
1.创建对象——封装: 2个
1.创建一个单独的对象:
1.对象直接量:
var obj={
属性名:属性值,
... : ...,
方法名:function(){...}
}
何时使用:如果创建对象时,已经知道对象的所有属性和方法时。
对象的属性和方法,统称为对象的成员
对象中的每个成员名都是字符串类型
但是,可省略""
问题: 对象的方法中,不能写死对象的属性值
解决: 在对象的方法中,直接访问当前对象自己的属性
this关键词: 专门用在对象的方法中,用来指代正在调用方法的当前对象本身。
其实就是调用方法时,点"."前的对象
总结: 只要在对象的方法中,访问对象自己的属性,必须用this.属性名


2.用new关键词:
var obj=new Object();//创建空对象
={}
obj.属性名=值;
obj.方法名=function(){
...
}
何时使用: 创建对象时,还不知道对象的属性和方法,需要后续动态添加。


js中一切对象都是关联数组
相同: 1. 属性名都是字符串,不可重复
2. 随时添加新属性和方法
3. 可用for in遍历
2.批量创建多个相同结构的对象


2步:
1. 定义构造函数:
构造函数:专门定义一类对象统一结构的特殊函数。
为什么: 代码重用
何时使用:今后,只要反复创建多个相同结构的对象前,都要用构造函数先定义统一的结构。
如何定义:
function 类型名/构造函数名(属性参数,..){
//this:当前正在创建的空对象
//向当前空对象中添加新的属性
this.属性名=属性参数;
//向当前空对象中添加新的方法
this.方法名=function(){
...
}
}


2. 用new调用构造函数创建新对象:
var obj=new 构造函数名(属性值);

 

new: 4件事
1.创建一个空对象
2.设置新对象的__proto__继承构造函数的原型对象。
3.用当前新对象调用构造函数,向对象中添加属性和方法。
4.将新对象地址,返回给变量保存。
解决: 继承:
面向对象三大特点: 封装 继承 多态
继承: 父对象的成员,子对象不必重新创建,就可直接使用。
js中的继承都是用过原型对象实现的
原型和原型链:
原型:保存一类对象,共有成员的父级对象
为什么: 为了实现继承,
优: 代码重用和节约内存
何时使用:只要一类对象共有的成员,都必须集中定义在原型对象中一次即可。
如何使用:
创建: 在定义构造函数时,js会自动创建该类型的原型对象
向原型对象中添加共有成员:
构造函数.prototype.成员名=值

内置对象的原型对象:
解决浏览器的兼容性问题:
如果需要的API,在指定类型的原型对象中不存在,说明不支持
就要在该类型的原型对象中添加所需的共有成员。
其中,在API内部,用this获得当前正再调用API的点前的对象

原型链: 由各级父对象,逐级继承形成的链是结构。
控制着对象成员(属性和方法)的使用顺序:
优先使用对象本地的成员——自有属性
如果本地没有,才延原型链向上查找各级父对象。直到找到为止。——共有属性
如果整个原型链上没有,才返回undefined

判断成员是自有属性,共有属性:
1. 判断自有属性:
var bool=obj.hasOwnProperty("属性名")
判断"属性名"是否是obj的自有属性
保存在obj对象本地。
是自有属性,返回true,否则返回false
2. 判断共有属性:
问题:不是自有属性:
1. 可能在原型链上
2. 也可能根本没有
解决:不是自有,且可以访问到
!obj.hasOwnProperty("属性名")
&&obj.属性名!=undefined

如何修改自有属性和共有属性:
自有属性,只能用所在的对象去修改
共有属性,必须通过原型对象去修改
如果强行使用某个子对象,修改共有属性
后果: 仅在当前子对象添加同名自有属性
导致:当前子对象无法再使用共有属性
删除属性: delete 对象.属性

亲子鉴定:
1.用原型对象检查
var bool=father.isPrototypeOf(child)
判断child是否继承自father
father是否在child的原型链上
如果father在child的原型链上,返回true
否则返回false
2.用构造函数检查
var bool=child instanceof 构造函数
判断child是否是构造函数创建出来的子对象。
补:instance实例:用一个构造函数创建出的一个子对象,就称为子对象是构造函数的实例。
var obj=new 构造函数();
实例化一个"构造函数"类型的对象
var obj=new Array();
var dt=new Date();
多态: 同一个函数,在不同情况下,表现出不同的状态。
重写(override):如果子对象,觉得父对象的成员不好用,就可在子对象本地,重新定义同名成员,来覆盖父对象的成员

call: 强行借用一个本来无法调用到的函数
目标函数.call(obj)
执行时: 相当于obj.目标函数

 

JavaScript笔记(七)