借用构造函数继承父类型属性
核心原理: 通过 call() 把父类型的 this 指向子类型的 this ,这样就可以实现子类型继承父类型的属性。
function Father(uname, age) {
this.uname = uname
this.age = age
}
function Son() {
Father.call(this, 'kobe', '18')
}
console.log(new Son());
借用原型对象继承父类型方法
核心原理:
- 将子类所共享的方法提取出来,让子类的 prototype 原型对象 = new 父类()
- 本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象
- 将子类的 constructor 从新指向子类的构造函数
function Father(uname, age) {
this.uname = uname
this.age = age
}
Father.prototype.basketBall = function() {
console.log('我会打篮球');
}
function Son(uname, age) {
Father.call(this, 'kobe', 18)
}
// Son.prototype = Father.prototype; 这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
Son.prototype = new Father()
// 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数
Son.prototype.constructor = Son
Son.prototype.footBall = function() {
console.log('我会踢足球');
}
var son = new Son()
var father = new Father()
console.log(son);
console.log(Father.prototype);
console.log(Son.prototype.constructor);