(1) 原型继承
借用 父类构造函数生成的 实例化对象 添加给子类构造函数
效果 可以访问调用父类构造函数,公共空间 prototype 中的数据
原型继承总结
父类声明实例化对象,直接定义在子类构造函数的 prototype 中
父类实力话对象的属性,并没有直接定义在子类实力话对象中
主要是 通过 父类实例化对象 作为 原型链 的补充部分
链接 父类构造函数 和 子类构造函数
原型继承,主要是通过 __proto__ 让子类构造函数 可以 访问 父类构造函数的 prototype
// 原型继承
function Father(name,age){
this.name = name;
this.age = age;
}
Father.prototype.fun1 = ()=> console.log('我是父类构造函数的程序');
// 通过父类构造函数,创建一个 实例化对象
const objFather = new Father('张三',18);
// 原型继承语法,将 通过父类构造函数,生成的实力话对象,添加在子类构造函数中
function Son(){}
// 在 prototype 中 直接添加 父类构造函数生成的实力话对象
Son.prototype = objFather;
// 通过子类构造函数,生成的实例化对象
const objSon = new Son();
Son.prototype.fun1();
// 简写方式
// 原型继承语法,将 通过父类构造函数,生成的实力话对象,添加在子类构造函数中
function Son(){}
Son.prototype = new Father('张三',18);
Son.prototype.fun1()
(2) 借用构造函数继承
为了继承父类的属性和属性值,可以直接定义在子类实例化对象中
只能继承父类的属性,不能访问父类的 prototype 调用父类的方法
父类构造函数,this,指向父类实例化对象
在 子类构造函数中 调用 父类构造函数
同时 改变 父类构造函数的this指向
从 指向 父类实例化对象 改变为 指向 子类实例化对象
父类.call(this , 参数...)
此处的this是子类构造函数的this,指向的是 子类实例化对象
// 父类构造函数
// 父类构造函数中,属性和属性值 this.name = name; this.age = age;
// 会直接定义在父类构造函数,生成的实力话对象中
// 原因就是因为 构造函数中, this 默认指向的是 构造函数,生成的实力话对象
// 子类构造函数,如果需要继承父类构造函数的属性,必须要让父类构造函数,this指向子类实例化对象
function Father(name,age){
this.name = name;
this.age = age;
}
Father.prototype.fun1 = ()=> console.log(this.name);
const obj1 = new Father('李四' , 100)
// 子类的构造函数
function Son(){
// 调用执行父类构造函数,此时父类构造函数,this,指向父类构造函数,生成的实例化对象
// 当前的位置是 子类构造函数中 子类构造函数的this,指向子类实例化对象
// 只要将父类构造函数的this,改变成当前的this,就会执行子类实例化对象
// 父类的this,变成当前的this
// 也就是父类的this,从指向obj1 变成指向 obj2
Father.call( this , '王五' , 150 );
}
const obj2 = new Son();
console.log(obj2.name); //王五
(3) 组合继承
两种方法一起用,同时继承父类的 属性 直接定义在 子类构造函数中
并且可以访问 父类构造函数 prototype 中的 方法
// 父类
function Father(name,age){
this.name = name;
this.age = age;
}
Father.prototype.funFather = ()=> console.log('我是父类构造函数的程序');
// 组合继承
function Son(sex){
// 继承属性
Father.call(this,'张三',18);
// 定义自己的属性
this.sex = sex;
}
// 继承方法
Son.prototype = new Father('李四',20);
// 定义自己的方法
Son.prototype.funSon = ()=> console.log('我是子类构造函数的程序');
// 创建子类实例化对象,只要输入自己的属性就可以了
const objSon = new Son('男');
Son.prototype.funSon();
Son.prototype.funFather();
console.log(objSon); // Son {name: "张三", age: 18, sex: "男"}
Comments | NOTHING