javascript第十三天面向对象
js面向对象
- 面向对象初识
(1) Oop 面向对象编程 是一种编程思想
(2) 对象和类的概念
① 对象是用来描述信息的数据
1) 属性:静态的, 用来描述对象的一些静态特征
2) 方法:动态的, 用来描述对象的一些动态行为
② 类
1) 类可以用来创建对象, 一个类可以创建任意个对象。(es5中不存在类的概念)
2) 构造函数
(3) 我们以前的编程思路 叫做 面向过程 今天学习的思路为面向对象
① 面向对象的优势:高内聚低耦合,
② 缺点:不符合人类的逻辑思维
(4) 面向对象的三大特征
① 封装:我们将不同的功能模块封装为 对象 从而降低不同功能模块之间的关联,做到高内聚低耦合
② 继承:
③ 多态:js中不存在严格的多态,js中多态的定义是 同一操作 在不同环境中 会得到不同的结果
1) + 1+1 = 2 “1”+1 = “11”
- 面向对象创建
(1) 字面量创建对象 {属性名:属性值}
① 优势:写法简单,直观
② 缺点:无法批量创建对象
(2) 实例创建对象 var obj = new Object() obj.属性名 = 属性值...
① 优势:类型很明确
② 缺点:创建更加繁琐,不利于批量创建
(3) 工厂模式创建
function factory(name,age,hobby){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.hobby = hobby;
return obj;
}
① 优势:可以批量创建对象
② 缺点:this的值是window 不是创建出的对象,不方便后续操作
(4) 构造函数
function Teacher (){
//js偷偷创建一个空对象 obj
//js将构造函数的this 赋值为 obj this = obj
this.name = "老肖";
this.age = "18";
this.hobby = "电音";
//js将绑定好属性的obj对象 隐式返回出来 我们看不到
}
① 构造函数执行过程
1) Js隐式创建空对象 js偷偷创建出了一个空对象 obj{}
2) Js将构造函数的 this 赋值为 隐式创建的空对象 obj
3) 执行构造函数中 的 代码 通过this 给空对象绑定属性
4) Js会将 绑定好属性的 obj对象 隐式返回出来
② 构造函数的this 的 值 就是 创建出的对象
③ 优点:代码编写简单、this的值 就是 创建的对象,便于后续操作
④ 缺点:当出现重复属性的时候 就很容易造成 内存浪费
(5) 原型创建
function Teacher (){}
Teacher.prototype.name = "lx";
Teacher.prototype.age = "18";
var son = new Teacher();
① 优点:节省内存
② 缺点:过于死板,属性值无法改变
(6) 混合式创建对象
① 将容易改变的属性 放在构造函数中给对象绑定 将不易改变的属性放在原型中 最大限度节省内存
function Teacher (name,age){
this.name = name;
this.age = age;
}
Teacher.prototype.belong = "中公教育";
② 优点:可以用构造函数 控制容易改变的属性值 又可以在原型中最大限度节省内存空间
- 面向对象实例
(1) 遇到问题,有对象就用对象,没有对象就创建对象然后用对象
(2) 面向对象思路
① 分析当前创建的对象中 有哪些需要描述的不确定值 用构造函数给自对象绑定这些属性
② 分析当前对象要执行哪些具体功能 在原型中封装方法 继承给子对象
- 面向对象继承 请关注下榻天涯的故事
(1) 对象的命名空间
① 一般当我们的项目做的比较大的时候 变量命名 往往不够用,我们就可以使用命名空间
② Var a = 20 window.a = 20
③ Var zone = {}
④ Zone.a = 30
⑤ Zone.a
(2) 原型链继承
① 原型链:在子对象 和 Object.prototype中 存在一个由__proto__连接起来的链式结构,我们称之为 原型链 子对象 可以 使用 原型链中的所有属性
② 原型链的属性查找原则:当对象调用属性的时候 会先在当前对象中查找,如果有就使用,如果没有 就向原型中查找,如果有就使用,如果还没有,就继续向上一级原型中查找, 一直找到Object.prototype,如果有就使用, 如果还没有,值为undefined
③ 优点:可以最大程度节省内存
④ 缺点:难以随意改变属性的值 因为是继承过来的 会导致其他子对象一起变化
(3) 对象冒充继承
① call和apply
1) Call和apply统称为立即执行函数, 他们都是函数的方法,都是用来改变函数的this指向的。
2) 用法:
- Call:函数名.call(要改变的this指向,原函数需要的实参1,实参2......)
- Apply:函数名.apply(要改变的this指向,[原函数需要的参数1,参数2...])
3) 作用:首先将原函数的this值改变,立即调用原函数
4) 优点:可以很方便的修改对象的属性值
5) 缺点:不能继承到原型链中的属性
(4) 组合式继承
(5) 寄生组合式继承
浙公网安备 33010602011771号