# 继承
老实说 js 的继承设计过于沙雕
# 原型链
对应关系大致如下图
# 继承蚂蚁花呗
旧时代 js 青年的继承写法很多, 我以前喜欢这么写
function Super () {
this.name = 'feng'
this.PHP = 'the best programming language'
}
Super.prototype.fuck = function () {
return 'Just Fuck Java C'
}
function Child () {
Super.call(this)
this.name = 'feng ying'
}
Child.prototype = Object.create(Super.prototype)
Child.prototype.constructor = Child
console.log(new Child())
console.log((new Child()) instanceof Child)
console.log((new Child()) instanceof Super)
传说中道格拉斯封装的继承方法
function inherits(Child, Parent) {
var F = function () {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
inherits(Child, Super)
# ES6
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor方法和toString方法之中,都出现了super关键字,它在这里表示父类的构造函数,用来新建父类的this对象。
class Super {
constructor () {
this.name = 'feng'
this.PHP = 'the best programming language'
}
fuck () {
return 'Just Fuck Java C'
}
}
class Child extends Super {
constructor () {
super()
this.name = 'feng ying'
}
}
let feng = new Child()
console.log(feng.fuck())
console.log(feng)
console.log(feng instanceof Child)
console.log(feng instanceof Super)
# Class 的静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
class Foo {
static classMethod() {
return 'Just Fuck Java C'
}
}
Foo.classMethod() // 'Just Fuck Java C'
var foo = new Foo()
foo.classMethod()