一、class类继承
(1)class继承还是基于原型的。
(2)es5和es6继承机制区别:
es5是先创建子类实例,再盗用构造函数,将父类实例属性和方法添加到子类实例上。
es6是先调用super方法,通过父类constructor方法将父类实例属性和方法添加到this对象上,再通过子类构造函数修改this指向。
(3)super关键字,相当于父类构造函数,作用是将父类实例方法与属性添加到this对象上,但是返回子类实例,即super内部this指向子类实例对象。
class A {
constructor(name){
this.name = name
}
sayHi(){
console.log(`i'm${this.name},an instance of Class A`)
}
}
class B extends A {
constructor(name,identity){
super(name)
this.identity = identity
}
greet(){
console.log(`i'm ${this.identity}`)
}
}
二、instanceof
用于检测构造函数的prototype属性是否在某个函数的原型链上。
后面的参数一定是构造函数。Object.prototype在所有引用值的原型链上
[] instanceof Array // true
[] instanceof Object // true
Array instanceof Object // true
**怎么判断数组? obj instanceof Array**
三、手写简易JQuery考虑插件与拓展性
思路: 构造函数接受一个选择器,将don节点赋值到自己身上,添加length属性(类数组),有获取元素的方法,遍历的方法,还有添加事件监听方法。
插件:在class的原型对象上添加方法。
拓展性: 写一个新的class,继承于原来的类(extends和super方法)。
class JQuery {
constructor(selector) {
let domList = document.querySelectorAll(selector);
for (let index in domList) {
this[index] = domList[index];
}
this.length = domList.length;
this.selector = selector;
}
get(index) {
return this[index];
}
each(fn) {
for (let index = 0; index < this.length; index++) {
return fn(this.domList[index]);
}
}
on(type, handler) {
this.each(() => {
document.addEventListener(type, handler.bind(this), false);
});
}
}
// 插件拓展,在原型上添加方法
JQuery.prototype.dialog = (info) => {
alert(info);
};
// 拓展性, 自己写一个类,继承自其他类,这样就可以在原来功能上,拓展自定义类
class myJQuery extends JQuery {
constructor(selector) {
super(selector);
}
addClass(className) {
console.log(className);
}
}