OOP的三大特征
1.封装
把通用的部分 放到一起
?要去使用封装
1.代码规整
方便使用
2.快速使用已封装好的功能
节省开发时间
3.便于协作
4.便于调试
节省开发时间
5.便于形成模板
封装需要考虑的面
1.代码逻辑
2.耦合度一定要低
3.使用你封装工具的用户
尽量做到傻瓜化
4.可维护性
考虑将来可能会很多人一起维护这个工具
2.继承
概念
子类 可以 使用 父类 公开的所有属性和方法
js实现继承
通过原型对象prototype
可以认为 原型对象 是一个共享空间,在放某个方法或属性之后 创建的对象就都可以使用 放进去的东西
扩展数组方法
获取数组中最后一个元素
获取数组中第一个元素
实现方式
1.修改原型对象实现继承
//父类
function Person(_name,_age) {
this.username = _name;
this.age = _age;
this.speak = function (message) {
console.log(this.username+"说:"+message)
}
}
//子类
function Chinese() {
}
Chinese.prototype = new Person("小明",18);
console.log(new Chinese())
var daMing = new Chinese();
daMing.speak("哈哈哈")
弊端:this指向问题
2.调用父类 构造函数实现继承
function Chinese() {
Person.apply(this,arguments);
}
var xiaoMing = new Chinese("小明",18);
console.log(xiaoMing);
弊端:继承的层级关系不明显
3.混合继承
function Chinese() {
Person.apply(this,arguments);
}
//为了不影响父类 创建了一个临时的类 去接收父类信息
function TempClass() {}
//接收父类的原型对象
TempClass.prototype = Person.prototype;
//修改 临时类原型对象(父类) 的 构造函数 为子类的构造函数
TempClass.prototype.constructor = Chinese;
//修改子类的原型对象 为临时类的原型对象(构造函数是子类的 但是原型对象是父类的)
Chinese.prototype = TempClass.prototype;
优化
function Chinese() {
Person.apply(this,arguments);
}
var superProto = Object.create(Person.prototype)
superProto.constructor = Chinese;
Chinese.prototype = superProto;
继续优化
function inherit(SuperClass,SubClass) {
var superProto = Object.create(SuperClass.prototype)
superProto.constructor = SubClass;
SubClass.prototype = superProto;
}
function TangShan() {
Person.apply(this,arguments)
}
inherit(Person,TangShan);
完美优化
重要的关键字
this
实例化 出来的对象 本身
prototype
原型对象
可读写属性
使用类名调用
类方法(静态方法)
__proto__
原型对象
只读属性
对象调用
实例方法
constructor
构造器(构造函数)
3.多态
同一个方法 不同对象使用 就有不同结果
setter getter 存取器
set存
get取
可以通过存取器 来设置 属性的权限(只读 只可写入 可读可写)
call apply bind
call apply
调起另外一个函数
区别
相同点:都可以调用另外一个函数(可以更改this指向)
不同点
传入参数不同
call 可以传入多个参数
sum.call(this,a,b);
apply 只能传入一个参数
sum.apply(this,[a,b]);