# javascript 继承
# 类式继承(原型继承)
function A () {}
function B () {}
B.prototype = new A()
优缺点 由于指向A的实例, 那么可以访问父类新增原型方法/属性 但不能多继承
# 构造函数继承
function A(){}
function B(){
A.call(this);
}
优缺点 可以实现多继承 但不能访问父类原型方法和属性
# 组合式继承
function B(){}
function A(){}
B.prototype = new A();
function B(){
A.call(this);
}
可以继承实例属性/方法,也可以继承原型属性/方法, 但是执行了两个A的构造函数
# 寄生组合式继承
// 寄生组合式继承的核心方法
function inherit(child, parent) {
// 继承父类的原型
const p = Object.create(parent.prototype)
// 重写子类的原型
child.prototype = p
// 重写被污染的子类的constructor
p.constructor = child
}
// GithubUser, 父类
function GithubUser(username, password) {
let _password = password
this.username = username
}
GithubUser.prototype.login = function () {
console.log(this.username + '要登录Github,密码是' + _password)
}
// GithubUser, 子类
function JuejinUser(username, password) {
GithubUser.call(this, username, password) // 继承属性
this.articles = 3 // 文章数量
}
// 实现原型上的方法
inherit(JuejinUser, GithubUser)
// 在原型上添加新方法
JuejinUser.prototype.readArticle = function () {
console.log('Read article')
}
const juejinUser1 = new JuejinUser('ulivz', 'xxx')
console.log(juejinUser1)
← 什么是表达式语句 设计模式(创建设计模式) →