JS面试题之原型

1.什么是原型?

答:每一个对象都有它的原型对象,它可以使用自己原型对象上的所有属性与方法。

2.获取原型的方法?

答:一是通过对象的__proto__获取

 let cat = {
      name: '猫'
    }
 cat.__proto__.eat = function() {
      console.log('我爱吃鱼')
    }
 cat.eat()

二是通过构造函数的prototype属性拿到原型

 function Cat (name, age) {
      this.name = name
      this.age = age
    }
 let cat = new Cat('喵喵', 2)
 Cat.prototype.eat = function() {
      console.log('我爱吃鱼')
    }
 cat.eat()

   三是通过类的prototype属性获取原型

   //ES6新引入类,与ES5中构造函数类似
    class Cat {
      constructor (name, age) {
        this.name = name
        this.age = age
      }
    }
    let cat = new Cat('喵喵', 2)
    console.log(cat.name)  //喵喵
    //获取原型,给原型添加方法
    Cat.prototype.eat = function() {
      console.log('吃鱼')
    }
    cat.eat() //吃鱼

3.原型有什么用?

能够扩展对象,不论是内置对象还是自己定义的对象,都可以通过prototype来扩展它,实现更方便的功能

    let date = new Date()
    console.log(date)  //Tue Mar 21 2023 17:06:56 GMT+0800 (中国标准时间)
    //转成YYYY年MM月DD日的形式
    Date.prototype.formate = function() {
      let year = this.getFullYear()
      let month = this.getMonth() + 1
      let date = this.getDate()
      return `${year}年${month}月${date}日`
    }
    console.log(date.formate())

4.如何基于构造函数的prototype来实现继承?

    function User (username, password) {
      this.username = username;
      this.password = password;
      this.login = function() {
        console.log('登录')
      }
    }
    function Admin () {
      this.deleteUser = function() {
        console.log('删除一个用户')
      }
    }

    // 实现继承 Admin可以使用原型上所有方法,让原型是User的实例,Admin可以使用User上所有方法
    Admin.prototype = new User()

    let admin = new Admin()
    admin.login()

5、什么是原型链?

答:一个对象有原型,原型也是一个对象,原型上面还有自己的原型,构成原型链。

        在调用方法或属性时,先在自身找,如果没有就依次向上到原型上、原型的原型上找,有则输出,没有报错,最上层为Object的原型

补充:原型链的顶端为 null

你可能感兴趣的:(原型模式)