继承的方式
原型链继承
把父类的实例化对象 赋值给子类的原型对象
+ 优点: 可以从父类上面继承所有的方法和属性
+ 缺点: 需要在两个地方进行传递参数
子类就没有自己的原型对象 如果添加方法会直接添加到父类的实例化对象里面
原型链继承实例
*/
// 父类构造函数
function Father(name, age) {
this.name = name
this.age = age
}
Father.prototype.money = function(){
console.log('可以挣钱')
}
// 把父类的实例化对象 赋值给子类的原型对象
Son.prototype = new Father('小小强',20)
Son.prototype.worker = function(){
console.log('敲代码')
}
使用构造函数继承
借用构造函数继承 (call) ,在子类构造函数体类 改变父类构造函数的this指向
+缺点: 只能继承父类构造函数体类的方法 不能继承原型对象上面的方法
+ 优点: 只需要在一个地方进行传递参数
构造函数继承实例
// 父类构造函数
function Father(name, age) {
this.name = name
this.age = age
console.log('fffff>', this)
}
Father.prototype.money = function () {
console.log('可以挣钱')
// console.log(this) // 指向实例化对象
}
//子类构造函数
function Son(like, ...arg) {
this.like = like
console.log('son>>>>', this) // 指向子类实例化对象
// Father.call(this,...arg)
Father.apply(this, arg)
}
Son.prototype.worker = function () {
console.log('敲代码')
}
let s1 = new Son('打游戏', '小小强', 15)
组合继承
原型链继承和借用构造函数继承一起使用
+ 借用构造函数继承 继承父类构造函数体类的方法和属性 放在子类实例化对象体类
+ 原型链继承主要帮助 继承父类构造函数原型对象上面的方法和属性
优点
+ 只需要在一个地方进行传递参数
+ 子类没有自己的原型对象
组合继承实例:
// 父类构造函数
function Father(name, age) {
this.name = name
this.age = age
this.play = function(){
console.log('打人')
}
}
Father.prototype.money = function () {
console.log('可以挣钱')
}
//子类构造函数
function Son(like, ...arg) {
this.like = like
// 借用构造函数继承
Father.call(this,...arg)
}
Son.prototype.worker = function () {
console.log('敲代码')
}
// 原型链继承
Son.prototype = new Father()
// 子类实例化对象
let s1 = new Son('打游戏','小小强',16)
拷贝继承
-
在子类构造函数体类进行父类的实例化 得到一个实例化对象,遍历拷贝到子类的实例化对象体类
特点:+ 可以继承父类构造函数体类的方法和属性 也可以继承原型对象上面的方法和属性 + 也可以只只在一个地方传参数
拷贝继承实例:
// 父类构造函数
function Father(name, age) {
this.name = name
this.age = age
this.play = function(){
console.log('打人')
}
}
Father.prototype.money = function () {
console.log('可以挣钱')
}
//子类构造函数
function Son(like, ...arg) {
this.like = like
// 父类实例化一个对象
let f = new Father(...arg)
// 拷贝到子类的实例化对象上面
for(var key in f){
this[key] = f[key]
}
}
Son.prototype.worker = function () {
console.log('敲代码')
}
// 子类实例化对象
let s1 = new Son('打游戏','小强',16)
ES6继承
- 语法
class 子类 extends 父类{
constructor(){
super() // 传递参数 必须写到第一行
}
}
实例:
class Father{
constructor(name,age){
this.name = name
this.age = age
}
say(){
console.log('可以说话')
}
}
class Son extends Father {
constructor(...arg) {
super(...arg)
// this.say()
}
say() {
console.log(123)
}
paly() { }
}
let s1 = new Son('小伟', 26)