1、梳理知识点
面向对象 : 功能独立 便于后期维护 变量的私有化
面向过程 :
什么是类 :
类和对象的关系 :
对象创建的几种方式
1、字面量创建方法{ } new Object()
2、 工厂模式 instanceof
3、构造函数
4、解决构造的缺点 :使用原型方法
5、混合
原型对象 : 构造函数都有一个prototype属性 该属性就是原型对象
原型链 : 实例对象和原型之间的连接
function Fun(){
this.name = "jack"
}
Fun.prototype.name = "lily"
Fun.prototype.age = 10;
var f = new Fun();
console.log( f.name , f.age) jack 10
原型模式的执行流程 :
2、继承
面向对象的三大特性: 封装 继承 多态(js没有)
继承 : 子类继承父类所有的属性和方法
3、继承方式一 : 通过改变父类的执行环境
function Father(){
this.money = 999999999999;
this.sing = function(){
console.log("唱歌");
}
}
function Son(){
在子类中定义一个属性 这个属性的值指向父类的构造函数
this.parent = Father;
调用子类的属性
this.parent();
}
4、通过call或apply继承
call和apply:改变非匿名函数的this指向(不能继承原型)
在子类中调用父类
Father.call(this,name)用call方式接收实参
var Son = new Son("xiaoming")
Father.apply(this,arguments)用数组方式接收实参
var Son = new Son("xiaoming")
call和apply的区别 :
call的第二个参数个数不固定
apply的第二个参数是一个数组,可以通过arguments来代替
5、原型继承
让子类的原型对象指向父类new出来的实例对象( 首先在子类的实例上查找,找不到去原型上查找)
子类.prototype = new 父类();
缺点:
继承可变的实例属性时,属性值无法更改
这样的实例属性应该由call或apply的方式继承
6、混合继承
通过call或apply方式继承实例属性
通过原型继承 继承方法
7、ES6的构造函数
class 构造函数名{
constructor(属性){ 使用constructor构造属性
this.属性 = 属性
}
方法(){
}
}
例如 :
class Student{
constructor(name,age){
this.name = name;
this.age = age;
}
study(){
return ""
}
eat(){
console.log()
}
}
8、ES6的继承
class Son extends Father{ extends继承
constructor(name,age,score){
super(name,age); 使用super可以继承父类的属性和方法
this.score = score;//子类特有的属性
}
//子类特有的方法
study(){
return "学习ing";
}
}