特征
-
封装:把需要复用的代码 放入对象的方法中
-
继承:一个对象拥有另一个对象的所有成员(JS重点)
-
多态:一个对象在不同情况下的多种状态
继承(JS)
子对象 继承 父对象所有的成员
js中常用的三种继承方式
假设有两个对象,一个是父亲对象,一个是儿子对象,父亲有房子属性(或其他属性),儿子通过继承的方式获得父亲的房子属性(或其他属性)。
1. 混入式继承
遍历父对象成员添加给子对象(forin),一般用于继承一个子对象,如果子对象一多,代码冗余(有几个继承就要写几次forin循环了)。
//父对象
let father = {
house: {
address: 'xxxxx小区',
price: 'xxxx¥'
}
}
//子对象
let son = {
worker: '销售员' //本身的属性
}
/*
混入试继承:遍历父对象成员添加给子对象
*/
for (let key in father) {
son[key] = father[key];
}
console.log(son); //son中除了自己的属性(儿子的工作),还有了爸爸的房子(继承过来的)
2. 替换原型继承
将父对象作为子对象的原型(适用于多个继承),可以实现多个子对象继承,但是会覆盖子对象默认的原型。
//父对象
let father = {
house: {
address: 'xxxxx小区',
price: 'xxxx¥'
}
}
//第二种方式:
//替换原型继承:将父对象作为子对象的原型
function Son(work) {
this.work = work;
}
//子对象默认的原型
Son.prototype.hobby = function() {
console.log('乒乓球');
}
//将父对象作为子对象的原型
Son.prototype = father; //这里就会把Son中的默认原型hobby给替换成了father中的属性
let son1 = new Son('销售员');
let son2 = new Son('程序员');
console.log(son1.house, son2.house);
3.混合式继承
混入式 + 替换原型
*遍历父对象所有成员,添加给对象的原型
//第三种方式
//混合式继承 : 混入式+替换原型
function Son(work) {
this.work = work;
}
//子对象默认的原型
Son.prototype.hobby = function() {
console.log('乒乓球');
}
//遍历父对象所有成员,添加给子对象原型
for (let key in father) {
Son.prototype[key] = father[key];
}
let son1 = new Son('销售员');
let son2 = new Son('程序员');
console.log(son1.hobby(), son2.house);
原型链
原型链
每一个对象都有自己的原型,而原型也是对象,也会有自己的原型(链),以此类推形成一个链式结构---原型链。
原型
-
所有引用类型都有一个proto(隐式原型)属性,属性值是一个普通的对象
-
所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
-
所有引用类型的