1.问题:
程序中将来会保存大量的数据。而大量数据如果零散的随意管理,极容易出错!而且用着不方便。
2.解决:
今后程序中,都是用面向对象的方式,来管理大量数据的
3.什么是:
程序中会将描述一个事物的多个属性和功能集中保存在一个对象结构中,再起一个名字。
4.优点:
极其便于大量数据的管理维护。
5.面向对象三大特点:
封装、继承、多态
6.封装:
6.1什么是:
创建一个对象,集中保存现实中一个事物的属性和功能。
6.2为什么:
极其便于大量数据的管理维护。
6.3何时:
今后,只要使用面向对象思想开发时,第一步都是先封装各种各样的对象结构备用。
6.4怎么使用:三种方式
6.4.1用{}(字面量)
var 对象名={ //new object()的简写
属性名:属性值,
...:...,
方法名:function(){...}
}
如何访问对象中的成员:
对象名.属性名
对象名.方法名()
问题: 在对象自己的方法内,想使用对象自己的另一个属性名时,竟然报错!说xxx属性名未定义!
原因:对象不是作用域,所有函数的作用域链中没指向对象中的属性与方法
解决:
写死对象名.属性名(不推荐)
一旦对象名发生变化,而对象内写死的部分对象名,都会报错!"xxx is not defined!"
this.属性名(推荐)
对象中的方法中,只要想使用当前对象自己的属性或其他方法时,都用加this
原因:this是在当前函数作用域中,通过this可以找到属性的
| 什么是this? |
|---|
| 每个函数内自带的 —— 不用创建,直接使用 |
| 专门指向正在调用当前函数的.前的对象的——内容 |
| 关键字——不能改名 |
| 强调: 今后,判断this指谁,一定不要看定义在哪儿!只看在哪里以何种方式调用函数。 |
6.4.2用new(实例化)
var 对象名=new Object(); //先创建空对象{}
//强行给空对象中添加新属性和新方法
对象名.新属性=属性值;
对象名.新方法=function(){ ... this.属性名 ... }
揭示了js语言对底层的核心原理: 其实,js中所有对象底层都是关联数组
存储结构: 都是名值对儿的组合
访问成员时:
①标准写法都是: 对象名/数组名["成员名"]
②简写都是: 对象名/数组名.成员名 这里的**.等于[""]**
③特殊:
如果成员名是数字时,不能用.只能用[数字]
如果成员名是变量时,只能用[变量],不要加""
如果属性名或下标不是写死的!来自于一个变量(for in)!只能用[变量],也不能用.
强行给不存在的位置赋值,不但不会报错,而且还会自动添加该属性。
固定套路: 如何给一个对象添加新属性或方法:
只有唯一一种野蛮的办法: 强行赋值!
强行访问不存在的位置的值,都不会报错,而是返回undefined。
固定套路: 如何判断一个对象中是否包含某个成员:
if(对象.成员名!==undefined) //说明包含该成员
都可以用for in循环遍历!
克隆一个对象
6.4.3用构造函数:
问题:
用{}一次只能创建一个对象。如果想创建多个相同结构的对象时,代码就会很多重复!——极其不便于将来的维护。
解决:
今后,只要想反复创建多个相同结构,只是内容不同的对象时,都用构造函数。
什么是:
描述同一类型的所有对象的统一结构的函数。
如何: 2步:
1.定义构造函数:
function 类型名(形参1, 形参2, ...){
//将来要加入到新对象中的规定的属性
this.属性名=形参1;
this. xxx = xxx;
this.方法名=function(){ ... this.属性名 ... }
}
2.如何使用构造函数反复创建多个相同结构的对象
var 对象名=new 类型名(实参值1, 实参值2, ...)
//创建 指定类型的一个新对象
//同时把实参值传给构造函数的形参变量。
| new做的4件事: |
|---|
| 创建一个新的空对象等待 |
| 让子对象继承构造函数的原型对象 |
| 调用构造函数:①将构造函数中的this->new刚创建的新对象②在构造函数内通过强行赋值方式,为新对象添加规定的属性和方法 |
| 返回新对象的地址,保存到=左边的变量里。 |
什么时候用: ,什么时候用=
用{}创建一个新对象时,内部都用:
用构造函数创建新对象时,内部都用=
| 函数 与 方法: |
|---|
| 1. 不属于任何对象的,独立的function,称为函数 |
| 2. 保存在对象内部的function,称为方法。 |