美文网首页
面试题 闭包 继承 原型

面试题 闭包 继承 原型

作者: lucky_yao | 来源:发表于2021-11-04 11:28 被阅读0次

闭包

什么是闭包?闭包的作用?闭包的应用?
答:

函数执行,形成私有的执行上下文,使内部私有变量不受外界干扰,起到保护保存的作用

作用:

  • 保护
    • 避免命名冲突
  • 保存
    • 解决循环绑定引发的索引问题
  • 变量不会销毁
    • 可以使用函数内部的变量,使变量不会被垃圾回收机制回收

应用:

  • 设计模式中的单例模式
  • for循环中的保留i的操作
  • 防抖和节流
  • 函数柯里化

缺点

  • 会出现内存泄漏的问题

原型和原型链

什么是原型?什么是原型链?如何理解

答:

原型: 原型分为隐式原型和显式原型,每个对象都有一个隐式原型,它指向自己的构造函数的显式原型。

原型链: 多个__proto__组成的集合成为原型链

  • 所有实例的__proto__都指向他们构造函数的prototype
  • 所有的prototype都是对象,自然它的__proto__指向的是Object()prototype
  • 所有的构造函数的隐式原型指向的都是Function()的显示原型
  • Object的隐式原型是null

继承

说一说 JS 中的常用的继承方式有哪些?以及各个继承方式的优缺点。

答:

原型继承、组合继承、寄生组合继承、ES6的extend

原型继承

// ----------------------方法一:原型继承    // 原型继承    // 把父类的实例作为子类的原型   
 // 缺点:子类的实例共享了父类构造函数的引用属性   不能传参     
var person = {      friends: ["a", "b", "c", "d"]    }     var p1 = Object.create(person)     p1.friends.push("aaa")
//缺点:子类的实例共享了父类构造函数的引用属性     console.log(p1);    console.log(person);
//缺点:子类的实例共享了父类构造函数的引用属性 

组合继承

// ----------------------方法二:组合继承  
  // 在子函数中运行父函数,但是要利用call把this改变一下,    
// 再在子函数的prototype里面new Father() ,使Father的原型中的方法也得到继承,最后改变Son的原型中的constructor     
// 缺点:调用了两次父类的构造函数,造成了不必要的消耗,父类方法可以复用    
// 优点可传参,不共享父类引用属性   
 function Father(name) {      
    this.name = name     
     this.hobby = ["篮球", "足球", "乒乓球"]    }     
    Father.prototype.getName = function () {      console.log(this.name);    }    
     function Son(name, age) {      Father.call(this, name)      this.age = age    }     
      Son.prototype = new Father()    
      Son.prototype.constructor = Son     
     var s = new Son("ming", 20)     
    console.log(s); 

寄生组合继承

// ----------------------方法三:寄生组合继承   
 function Father(name) {
      this.name = name
      this.hobby = ["篮球", "足球", "乒乓球"]    }
     Father.prototype.getName = function () {
    console.log(this.name);    }
     function Son(name, age) {
      Father.call(this, name)
      this.age = age    }
     Son.prototype = Object.create(Father.prototype)
    Son.prototype.constructor = Son     
    var s2 = new Son("ming", 18)    
    console.log(s2); 

extend

// ----------------------方法四:ES6的extend(寄生组合继承的语法糖)
    //     子类只要继承父类,可以不写 constructor ,一旦写了,则在 constructor 中的第一句话    
// 必须是 super 。    
 class Son3 extends Father {
 // Son.prototype.__proto__ = Father.prototype      constructor(y) {        
super(200) 
 // super(200) => Father.call(this,200)      
  this.y = y      }    }

相关文章

网友评论

      本文标题:面试题 闭包 继承 原型

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