面试问题(一)

101 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

一、对于 原型 与 原型链 的理解

在js中万物皆对象、万物有原型,所以原型也是一个对象,通过原型可以实现对象属性的继承

js的函数对象中都有 prototype 这个内部属性,这个属性就是这个函数对象的原型

prototype 是不能被直接访问的,所以浏览器为我们提供了一个访问器

原型的主要作用就是为了实现继承与扩展对象

当访问一个对象的某个属性时,会先在这个对象本身的属性上查找,如果没有找到就会在这个对象的原型上查找 如果还是没有,就会去原型的原型上查找,这样一层层的往上找就会形成链式结构,称为 原型链

创建一个对象时,并不会立即生成属于这个对象的原型,但是当我们修改原型的时候,这个对象也会随着修改来继承改变

对于原型的理解可以举个例子

        let human = {
            thinking:function() {
            console.log('会思考')
        }
        } 
        let student = {
            name:'学生',
            learn:function(){
                console.log('会学习')
            }
        }
        
        // 学生是人类
        student.__proto__ = human

        let liming = {
            name : '李明'
        }
        
        // 李明是一个学生
        liming.__proto__ = student
        
        // 所以说李明既会学习又会思考
        liming.thinking()  //会思考
        liming.learn()   //会学习

二、常见的JS的继承方法

ES5 继承

  1. 原型链继承
  2. 借用构造函数继承(伪造对象或经典继承)
  3. 组继承(伪经典继承)
  4. 型式继承
  5. 寄生式继承
  6. 寄生组合式继承

ES6 继承

  1. 使用class构造一个父类

     class Parent {
            constructor(name,age){
                this.name = name
                this.age = age
            }
            sayName(){
                console.log(this.name)
            }
        }
    
  2. 使用class构造一个子类,并使用 extends 实现继承 , super 指向父类的原型对象

            class Child extends Parent {
            constructor(name,age,gender){
                super(name,age)
                this.gender = gender
            }
            sayGender(){
                console.log(this.gender)
            }
        }
    
  3. 实例化对象

        const ming =new Child('ming',18,'男')
        ming.sayGender()
        ming.sayName()
        console.log(ming.name)
        console.log(ming.age)
    

三、new的原理

四、call

(还没写完)

加油加油!!

努力学习!!