Open MJingv opened 5 years ago
参考资料
这种继承方式优点在于构造函数可以传参,不会与父类引用属性共享,可以复用父类的函数, 但是也存在一个缺点就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。
function Parent(value) { this.val = value; }
Parent.prototype.getVal = function () { console.log(this.val); };
function Child(value) { Parent.call(this, value); //super }
Child.prototype = new Parent(); //extends
let child = new Child(1);
child.getVal();//1 console.log(child instanceof Parent);//true
- 寄生组合继承 > 1. 优化:组合继承缺点在于继承父类函数时调用了构造函数 > 2. 核心:**将父类的原型赋值给了子类,并且将构造函数设置为子类**,这样既解决了无用的父类属性问题,还能正确的找到子类的构造函数。 ```js function Parent(value) { this.val = value; } Parent.prototype.getVal = function () { console.log(this.val); }; function Child(value) { Parent.call(this, value); //super } // Child.prototype = new Parent(); Child.prototype = Object.create(Parent.prototype, { constructor: { value: Child, enumerable: false, writable: true, configurable:true, } }); let child = new Child(1); child.getVal();//1 console.log(child instanceof Parent);//true
class 实现继承的核心在于使用extends表明继承自哪个父类,并且在子类构造函数中必须调用super,因为这段代码可以看成 Parent.call(this, value)
class Parent { constructor(value) { this.val = value; }
getVal() { console.log(this.val); };
}
class Child extends Parent { constructor(value) { super(value); this.val = value; }
let child = new Child(1); child.getVal(); //1 console.log(child instanceof Parent);//true
继承
参考资料
function Parent(value) { this.val = value; }
Parent.prototype.getVal = function () { console.log(this.val); };
function Child(value) { Parent.call(this, value); //super }
Child.prototype = new Parent(); //extends
let child = new Child(1);
child.getVal();//1 console.log(child instanceof Parent);//true
class Parent { constructor(value) { this.val = value; }
}
class Child extends Parent { constructor(value) { super(value); this.val = value; }
}
let child = new Child(1); child.getVal(); //1 console.log(child instanceof Parent);//true