深拷贝

/** * 深拷贝 * @param {Object} obj 要拷贝的对象 */function deepClone(obj = {}) {    if (typeof obj !== 'object' || obj == null) {        // obj 是 null ,或者不是对象和数组,间接返回        return obj    }    // 初始化返回后果    let result    if (obj instanceof Array) {        result = []    } else {        result = {}    }    for (let key in obj) {        // 保障 key 不是原型的属性        if (obj.hasOwnProperty(key)) {            // 递归调用!!!            result[key] = deepClone(obj[key])        }    }    // 返回后果    return result}

class

// 类class Student {    constructor(name, number) {        this.name = name        this.number = number        // this.gender = 'male'    }    sayHi() {        console.log(            `姓名 ${this.name} ,学号 ${this.number}`        )        // console.log(        //     '姓名 ' + this.name + ' ,学号 ' + this.number        // )    }    // study() {    // }}// 通过类 new 对象/实例const xialuo = new Student('夏洛', 100)console.log(xialuo.name)console.log(xialuo.number)xialuo.sayHi()const madongmei = new Student('马冬梅', 101)console.log(madongmei.name)console.log(madongmei.number)madongmei.sayHi()

继承

// 父类class People {    constructor(name) {        this.name = name    }    eat() {        console.log(`${this.name} eat something`)    }}// 子类class Student extends People {    constructor(name, number) {        super(name)        this.number = number    }    sayHi() {        console.log(`姓名 ${this.name} 学号 ${this.number}`)    }}// 子类class Teacher extends People {    constructor(name, major) {        super(name)        this.major = major    }    teach() {        console.log(`${this.name} 传授 ${this.major}`)    }}// 实例const xialuo = new Student('夏洛', 100)console.log(xialuo.name)console.log(xialuo.number)xialuo.sayHi()xialuo.eat()// 实例const wanglaoshi = new Teacher('王老师', '语文')console.log(wanglaoshi.name)console.log(wanglaoshi.major)wanglaoshi.teach()wanglaoshi.eat()

原型关系

  • 每个class都有显式原型
  • 每个实例都有隐式原型_proto_
  • 实例的_proto_指向对应class的prototype
  • 基于原型的执行规定

    • 获取实例对象的属性或执行办法时
    • 先在本身属性和办法寻找
    • 如果找不到则主动去隐式原型_proto_中查找

原型链

手写繁难jQuery

class jQuery {    constructor(selector) {        const result = document.querySelectorAll(selector)        const length = result.length        for (let i = 0; i < length; i++) {            this[i] = result[i]        }        this.length = length        this.selector = selector    }    get(index) {        return this[index]    }    each(fn) {        for (let i = 0; i < this.length; i++) {            const elem = this[i]            fn(elem)        }    }    on(type, fn) {        return this.each(elem => {            elem.addEventListener(type, fn, false)        })    }    // 扩大很多 DOM API}// 插件jQuery.prototype.dialog = function (info) {    alert(info)}// “造轮子”class myJQuery extends jQuery {    constructor(selector) {        super(selector)    }    // 扩大本人的办法    addClass(className) {    }    style(data) {            }}// const $p = new jQuery('p')// $p.get(1)// $p.each((elem) => console.log(elem.nodeName))// $p.on('click', () => alert('clicked'))