js-day16 面向对象的继承

面向对象的继承

原型链继承

子类构造函数的原型对象 = 父类构造函数的实例化对象;

原型链查找:
    找自身
    自身没有 找自身的原型对象(父类构造函数的实例化对象)
    如果没有 找父类构造函数的原型对象
    找object
    如果没有 返回undefined  如果在哪一步找到了 直接返回结果
​
constructor:
    当前对象的构造函数
​
原型链继承: 
    1. 无法识别当前对象真正的构造函数
    2. 一改全改
    3. 不能传参
    4. 子类构造函数身上的原型对象的属性和方法不能继承
// 1. 父类构造函数
function Father(name, age) {
    this.name = name;
    this.age = age;
    this.money = ['交通', '存款', '理财'];
}
​
Father.prototype.work = function () {
    console.log('工作有收入');
};
​
// 2. 子类构造函数
function Son(){}
​
Son.prototype.hobby = function () {
    console.log('打游戏');
};
​
// 3. 设置继承: 子类构造函数的原型对象 = 父类构造函数的实例化对象;
Son.prototype = new Father('韩红', 50);
​
​
// 4. 实例化对象
var son1 = new Son();
​
console.log(son1);
console.log(son1.name);
console.log(son1.name1);

对象冒充继承

在子类构造函数中 调用父类构造函数 将父类构造函数this指向当前的this

不能继承父类构造函数的原型对象上的方法和属性

// 1. 父类构造函数
function Father(name, age) {
    this.name = name;
    this.age = age;
    this.money = ['交通', '存款', '理财'];
}
​
Father.prototype.work = function () {
    console.log('工作有收入');
};
​
// 2. 子类构造函数
function Son(name, age){
    // 3. 在子类构造函数中 调用父类构造函数 将父类构造函数this指向当前的this
    Father.call(this, name, age);
}
​
Son.prototype.hobby = function () {
    console.log('打游戏');
};
​
// 4. 实例化对象
var son1 = new Son('张三', 12);
var son2 = new Son('李四', 12);
console.log(son1, son2);
son1.money.push('股票');
console.log(son1.money, son2.money);
/* 
    不能继承父类构造函数的原型对象上的方法和属性
*/
console.log(son1.name1);

组合继承

组合继承: 原型链 + 对象冒充

\1. 子类构造函数的原型对象的方法和属性继承不了

\2. 父类构造函数的属性和方法多次继承

// 1. 父类构造函数
function Father(name, age) {
    this.name = name;
    this.age = age;
    this.money = ['交通', '存款', '理财'];
}
​
Father.prototype.work = function () {
    console.log('工作有收入');
};
​
// 2. 子类构造函数
function Son(name, age){
    // 3. 在子类构造函数中 调用父类构造函数 将父类构造函数this指向当前的this
    Father.call(this, name, age);
}
​
Son.prototype.hobby = function () {
    console.log('打游戏');
};
​
// 3. 子类构造函数的原型对象 = 父类构造函数的实例化对象
Son.prototype = new Father();
​
// 4. 实例化对象
var son1 = new Son('张三', 12);
var son2 = new Son('李四', 12);
console.log(son1, son2);
son1.money.push('股票');
console.log(son1.money, son2.money);
/* 
    不能继承父类构造函数的原型对象上的方法和属性
*/
console.log(son1.name1);

寄生式组合继承

Object.create(原型对象): 使用原型对象创建一个对象

/* 
    组合继承: 原型链 + 对象冒充
        1. 子类构造函数的原型对象的方法和属性继承不了
        2. 父类构造函数的属性和方法多次继承
*/
// 1. 父类构造函数
function Father(name, age) {
    this.name = name;
    this.age = age;
    this.money = ['交通', '存款', '理财'];
}
​
Father.prototype.work = function () {
    console.log('工作有收入');
};
​
// 2. 子类构造函数
function Son(name, age){
    // 3. 在子类构造函数中 调用父类构造函数 将父类构造函数this指向当前的this
    Father.call(this, name, age);
}
​
// 3. 子类构造函数的原型对象 = 父类构造函数的实例化对象
// Object.create(原型对象): 使用原型对象创建一个对象
// console.log(Object.create(Father.prototype));
Son.prototype = Object.create(Father.prototype);
// 单独设置
Son.prototype.constructor = Son;
​
// 后续son的原型对象添加属性和方法
Son.prototype.hobby = function () {
    console.log('打游戏');
};
​
var son1 = new Son('张三', 12);
console.log(son1);

图示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值