一、类与实例
- 类的声明
- 生成实例
二、类与继承
- 如何实现继承
- 继承的几种方式
三、一个对象继承的某个类,问你它的原型链
通过__proto__指向类的原型,然后指向object,最后指向null
一、
类的声明,1、构造函数2、es6的class
function Animal(){
this.name=‘name’;
}
class Animal2{
constructor(){
this.name=name;
}
}
//实例类的对象(实例化)
console.log(new Animal(),new Animal2())
二、
继承的本质就是原型链
js继承的几种形式,有几种方式,区别
继承的方式
1、借助构造函数实现继承
function Parent1(){
this.name=‘parent1’;
}
function Child1(){
Parent1.call(this);//apply,改变的是函数运行的上下文,父类的构造函数在子类中调用,并且修改this指向绑定到子类的实例上,从而导致父类执行的属性都会挂载到子类的实例上
this.type=‘child1’;
}
console.log(new Child1)
缺点:父类的原型对象上的方法子类拿不到
2、借助原型链
function Parent2(){
this.name='parent2';
this.play=[1,2,3]
}
function Child2(){
this.type='child2'
}
Child2.prototype=new Parent2();//子类的原型等于父类的实例
缺点:子类实例的原型都是父类的实例,是共用的,所以修改一个实例,会影响别的实例
3、组合继承
function Parent3(){
this.name=‘parent3’;
this.play=[1,2,3]
}
function Child3(){
Parent3.call(this);
this.type=‘child3’;
}
Child3.prototype=new Parent3();
var s1=new Child3();
var s2=new Child3();
s1.play.push(4);
缺点:父类的构造函数执行了俩次,由于call的时候复制了父类的实例,原型链继承的时候,通过原型链继承了父类原型上的方法和属性
优化一
Child4.prototype=Parent4.prototype;//继承原型上的
不足:改变了子类实例的construtor指向
优化二(寄生组合式继承)
Child5.prototype=Object.create(Parent5.prototype);//原型对象就是参数,优化了俩次属性和方法的继承
Child5.prototype.constructor=Child5//优化了constructor指向