美文网首页
JS原型的面试考点

JS原型的面试考点

作者: guoXuJianShu | 来源:发表于2020-10-12 09:25 被阅读0次

class与普通构造函数的区别

  1. class实际上是函数,是语法糖
  2. class在语法上更贴近面向对象的写法。
  3. class实现继承更加易读易理解。

class继承

  • extends
  • super
  • 扩展或重写方法
// 父类
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()

类型判断 - instanceof

原型


原型关系

  • 每个class都有显示原型prototype
  • 每个实例都有隐式原型__protot__
  • 实例的__protot__指向对应的class的prototype

基于原型的执行规则

获取自身属性或执行方法时,先在自身属性和方法寻找,如果找不到则去__protot__中查找

原型链


hasOwnProperty() 用来判断一个属性或方法是不是属于自身的,属于返回true
例如: xialuo.hasOwnProperty('eat'),结果为false

手写简易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'))

相关文章

网友评论

      本文标题:JS原型的面试考点

      本文链接:https://www.haomeiwen.com/subject/guqypktx.html