class Persion {}
class 的本质其实是函数
typeof Persion === 'function'
/**
* 原型链继承的例子
* 功能: 1.获取元素改变或者获取他的innerhtml。
* 2.添加事件。
*/
function Elem(id) {
this.elem = document.getElementById(id)
}
Elem.prototype.html = function(val) {
let elem = this.elem;
if (val) {
elem.innerHTML = val
return this //链式操作
} else {
return elem.innerHTML
}
}
Elem.prototype.on = function(type,fn){
let elem = this.elem;
elem.addEventListenner(type, fn);
return this;
}
let div = new Elem();
原型继承的缺点是在一个类上创建两个实例,在一个实例对象上修改属性,另一个实例上的属性也会被修改
function Parent() {
this.name = "parent"
this.arr = [1, 2, 3]
}
function Child() {
this.type = 'child'
}
Child.prototype = new Parent()
let s1 = new Child()
let s2 = new Child()
s1.arr.push(2222)
console.log(s2.arr)//[ 1, 2, 3, 2222 ]
console.log(s1.arr)//[ 1, 2, 3, 2222 ]
构造函数
解决引用类型共享问题
function Parent(name) {
this.name = name
this.color = ['pink', 'red']
}
function Child() {
Parent.call(this)//父级构造函数的那个类指向子构造函数的实例上(原理)
//定义自己的属性
this.value = 'test'
}
let child1 = new Child()
let child2 = new Child()
child1.color.push("white")
console.log(child1)
/*
name: undefined,
color: ['pink', 'red', 'white'],
value: 'test'
}*/
console.log(child2) //Child { name: undefined, color: [ 'pink', 'red' ], value: 'test' }
// 缺点就是子类无法继承父类的方法
Parent.prototype.say=function(){}
上面的say方法,子类无法拥有
组合继承
function Parent(value) {
this.val = value
}
Parent.prototype.getValue = function() {
console.log(this.val)
}
function Child(value) {
Parent.call(this, value)
}
Child.prototype = new Parent()
const children = new Child(1)
children.getValue()//1
console.log(children instanceof Parent)//true
寄生组合式继承
function Parent(value) {
this.val = value
}
Parent.prototype.getValue = function() {
console.log(this)
}
function Child(value) {
Parent.call(this, value)
}
Child.prototype = Object.create(Parent.prototype, {
constructor: {
value: Child,
enumerable: false,
writable: true,
configurable: true
}
})
以上继承实现的核心就是将父类的原型赋值给子类,并且将构造函数设置为子类,这样既解决了无用的父类属性问题,还能正确的找到子类的构造函数
class 继承
class Parent {
constructor(value) {
this.val = value
}
getValue() {
console.log(this.val)
}
}
class Child extends Parent {
constructor(value) {
super(value)
this.val = value
}
}
let child = new Child(2)
child.getValue()//2
console.log(child instanceof Parent)//true
核心是使用关键字extends 并在子类中使用关键字super