美文网首页让前端飞Web前端之路web前端面试题汇总
如何用class实现继承、本质是什么?

如何用class实现继承、本质是什么?

作者: loushumei | 来源:发表于2020-04-14 20:07 被阅读0次

1、实现继承的方法如下:

// 父类
class People{
    constructor(name){
        this.name=name
    }
    eat() {
        console.log(
            `${this.name} eat something...`
        )
    }
}

// 子类
// [extends] (ES6)关键字用来创建一个普通类或者内建对象的子类
class Student extends People {
    //constructor 属性返回对创建此对象的数组函数的引用。
    constructor(name,number){
        //[super](ES6)关键字用于访问和调用一个对象的父对象上的函数。
        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) //100
xialuo.sayHi() //姓名 夏洛 ,学号 100
xialuo.eat() //夏洛 eat something...

// //通过类声明对象/实例
const wang = new Teacher('王老师', '语文')
console.log(wang.name) //王老师
console.log(wang.major) //语文
wang.teach() //王老师 教授 语文
wang.eat() //王老师 eat something...

[constructor] 属性返回对创建此对象的数组函数的引用。
[extends] ES6关键字用来创建一个普通类或者内建对象的子类
[super] ES6关键字用于访问和调用一个对象的父对象上的函数。

2、class的本质是什么

console.log(typeof Student)//function
console.log(typeof People) //function

根据以上实例确定class的类型实际上是函数,可见class是语法糖

3、如何实现继承

通过判断实例的隐式原型和class的显示原型

console.log(xialuo.prototype) //xialuo的显式原型:undefined
// 实例xialuo没有显示原型
 
console.log(xialuo.__proto__) //xialuo的隐式原型:People {constructor: ƒ, sayHi: ƒ}
console.log(Student.prototype) //Student的显式原型 People {constructor: ƒ, sayHi: ƒ}
console.log(xialuo.__proto__ === Student.prototype) //true
实例xialuo的隐式原型 == 父类的显式原型

由此判断,子类实例就可以通过搜索原型的方法来访问父类中的所有属性和方法

原型关系图如下:


原型链.png

总结原型关系如下:

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

原型的执行规则:

获取属性xialuo.name或执行方法xialuo.sayhi时
现在自身属性和方法寻找
如果找不到自动去proto查找

4、延伸:instanceof 基于原型链判断类型

instanceof 可以判断一个引用是否属于某构造函数

console.log(xialuo instanceof Student) //true
console.log(xialuo instanceof People) //true
console.log(xialuo instanceof Object) //true

console.log([] instanceof Array) //true
console.log([] instanceof Object) //true
console.log({} instanceof Object) //true

instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false。

相关文章

  • 继承

    涉及面试题:原型如何实现继承?Class 如何实现继承?Class 本质是什么? 首先先来讲下 class,其实在...

  • 如何用class实现继承、本质是什么?

    1、实现继承的方法如下: [constructor] 属性返回对创建此对象的数组函数的引用。[extends] E...

  • class-继承(es6)

    继承-JS 继承-class class-总结 Class 在语法上更加贴合面向对象的写法Class 实现继承更加...

  • 类的底层原理探索(上)

    Class 的本质是 objc_class类型的结构体, objc_class本质也是对象,继承自objc_obj...

  • Class 的继承 extend继承 es6继承基本用法

    Class继承基本用法 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,...

  • 类 继承

    构造函数 等价于 静态方法 相当于 继承 class实现继承 原型实现继承

  • Swift1-1类与结构体区别

    区别: class是引用类型,struct是值类型;(本质区别) class可以继承类、接口和被继承,struct...

  • ES6之Class跟普通构造函数

    构造函数 Class构造函数 class的本质还是函数 Class 继承 总结 class更加贴近于面向对象的写法...

  • 如何用es5实现继承

    extend (继承) 如何用 es5 实现继承 测试 结果 原文链接

  • es6类的语法-js-v1.0.0

    实现继承Class 可以通过extends关键字实现继承检查继承用Object.getPrototypeOf这个方...

网友评论

    本文标题:如何用class实现继承、本质是什么?

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