- 类的声明
- 继承的几种方法
类的声明
第一种
function car(){ this.name = 'name'; }
第二种。es6中新添加的
class car(){ constructor(){ this.name ='name'; } }
继承的几种方法
1.构造函数实现继承
function Parent(){ this.name = 'parent'; } Parent.prototype.toSay = function(){ console.log(this.name); } function Child(){ Parent.call(this); this.name1 = 'child'; }
console.log(new Child())
原理:在子类中调用了父级的构造函数,并把上下文换成子类,只是部分继承
缺点:看到上面输出的就知道,父类的prototype上的方法继承不了
2、原型链继承
上面的方法父类的prototype的方法继承不了,就自然会想到把父类实例赋值给子类的prototype这样,因为Parent的实例的__proto__指向了Parent.prototype
function Parent(){ this.name='parent';
this.play = [1, 2, 3]; } function Child(){ this.type="child"; } Child.prototype = new Parent(); var c1 = new Child(); var c2= new Child();
c2.play.push(4);
console.log(c1.play, c2.play);
缺点:会改变原型链上的数值
优化组合方法一
function Parent(){ this.name= 'name'; this.play = [1, 2, 3]; } function Child(){ Parent.call(this); this.type = 'child' } Child.prototype = new Parent() var c1= new Child(); var c2 = new Child(); c2.play.push(4); console.log(c1.play, c2.play);
原理:这是上面两种方法的组合
缺点:父级的构造函数在子类实例的时候执行了两次
优化组合方法二
function Parent () { this.name = 'parent'; this.play = [1, 2, 3]; } function Child () { Parent.call(this); this.type = 'child'; } Child.prototype = Parent.prototype; var c1 = new Child(); var c2 = new Child(); console.log(c1 instanceof Child, c2 instanceof Parent); console.log(c1.constructor);
原理:和上面的一种比较是不再实例Parent而是直接将Child.prototype指向Parent.prototype,这样parent原型链上有的方法,child也会有
缺点:子类的构造器是父类,而不是子类,因为他们共用了一个原型对象
完美的方法
function Parent(){ this.name = 'parent'; this.play=[1,2] } function Child(){ Parent.call(this) this.type = 'child' } Child.prototype = Object.create(Parent.prototype) Child.constructor = Child;