每天一句:人生成功的秘密在于,当机会来临时,你已准备好。
一、什么是对象
对象就是一个整体,对外提供一些操作;
二、什么是面向对象
使用对象时,只关注对象提供的功能,不关注其内部细节(例如:jQuery);
三、面向对象
- 面向对象编程特点
抽象: 抓住核心问题;
封装: 不考虑内部实现,只考虑功能使用;
继承: 从已有对象上,继承出新的对象(多重继承、多态);
- 对象的组成
方法 — 函数: 过程、动态的
属性 — 变量: 状态、静态的
// 实例化对象
var zhangsan = new Object();
// 属性
zhangsan.age = 20;
zhangsan.sex = '男';
// 方法(函数)
zhangsan.speak = function(){
alert('年龄:'+ this.age + ',性别:'+this.sex);
}
// 调用方法
zhangsan.speak();
四、工厂模式
- 工厂
工厂:
1、原料
2、加工
3、出厂
function Person(name, sex){ // 构造函数
// 1、原料
var obj = new Object();
// 2、加工
obj.name = name;
obj.sex = sex;
obj.speak = function(){
alert('年龄:'+ this.name + ',性别:'+this.sex);
}
// 3、出厂销售
return obj;
}
// 通过构造函数创建对象
var zhaoliu = Person('赵六', '女');
- 工厂模式的问题
1、没有new
function Person(name, sex){ // 构造函数
// 2、加工
this.name = name;
this.sex = sex;
this.speak = function(){
alert('年龄:'+ this.name + ',性别:'+this.sex);
}
}
var zhangsan = new Person('张三', '男');
2、每个对象都有一套自己的函数(浪费资源)[类似: 教室的学生喝水,来上课都要饮水机]
案例: 混合法(工厂模式)
1、什么是设计模式?
设计模式: 是解决某类问题的方案;
五、prototype原型
- 动态的添加类的属性和方法
// 给数组添加方法 --- prototype原型
Array.prototype.sum = function(){
var result = 0;
for(var i = 0; i < this.length; i++) {
result += this[i];
}
return result;
}
- 复制原类的内容
// 将Person中的方法复制一份 -- 方法继承
for(index in Person.prototype){
Worker.prototype[index] = Person.prototype[index];
}
六、面向对象的改写步骤
改写
1、前提:所有东西都是在onload中;
2、改写:不能有函数嵌套,可以有全局变量;
3、
onload --> 构造函数
全局变量 --> 属性
函数 --> 方法
4、改错: this的处理
案例: 选项卡
七、this啥时候会出问题?
- 定时器
- 事件
解决办法:
不直接调用,而是再套一层,然后再用_this的方式调用;
var _this = this;
oBt.onclick = function(){
_this.tabClick();
}
八、Json方式的面向对象
- 面向对象
var p1 = {
name: 'EndEvent',
sex: '男',
showName: function(){
alert(this.name);
},
showSex: function(){
alert(this.sex);
}
};
p1.showName();
优点: 简单快捷
缺点: 需要多个对象时不方便
- 命名空间(大项目用的较多)
将方法进行归类,方便管理和使用(例如多个人或多个部门协同开发一个项目,即可将对应每个人或每个部门的一个空间);
var tentxun = {};
tengxun.search.xxx = {} // 搜索模块
tengxun.news.xxx = {} // 新闻模块
九、拖拽和继承
引用: JS中所有的对象都是引用;(例如: 一个房子,你有钥匙1,你结婚后你媳妇也有钥匙2;如果你媳妇进去房子将沙发换了个位置,那么当你回去的时候,沙发就是换了位置的,这也即是引用)
> 构造函数伪装
属性的继承(原理: 欺骗构造函数);
call的使用(改变this);
// 构造函数伪装: 调用父级的构造函数 ---- 为了继承属性
// this是new出来的Worker对象
// call是改变调用Person中的this,即传入的是Worker的对象(即在Person的构造方法中,此时this是Worker的对象)
Person.call(this, name, sex);
> 原型链
方法继承(原理: 复制方法,注意不能引用);
覆盖原型和方法复制;
call和apply的区别是什么?
参数形式不同,call(obj, pra, pra)后面是单个参数。apply(obj, [args])后面是数组。
例如:
Person.call(this, name, age);
Person.apply(this, [name, age]);