1.继承方式?
- 原型链的方式来实现继承,缺点是,在包含有引用类型的数据时,会被所有的实例对象所共享,容易造成修改的混乱。
- 借用构造函数的,原理:在子类型的函数中调用超类型的构造函数来实现的,问题就是无法实现函数方法的复用。
- 组合继承,通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继承。
- 原型式继承,原型式继承的主要思路就是基于已有的对象来创建新的对象,实现的原理是,向函数中传入一个对象,然后返回一个以这个对象为原型的对象。这种继承的思路主要不是为了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5中定义的 Object.create() 方法就是原型式继承的实现。缺点与原型链方式相同。
- 寄生式继承,寄生式继承的思路是创建一个用于封装继承过程的函数,通过传入一个对象,然后复制一个对象的副本,然后对象进行扩展,最后返回这个对象。这个扩展的过程就可以理解是一种继承。这种继承的优点就是对一个简单对象实现继承,如果这个对象不是自定义类型时。缺点是没有办法实现函数的复用。
- 寄生式组合继承,组合继承的缺点就是使用超类型的实例做为子类型的原型,导致添加了不必要的原型属性。寄生式组合继承的方式是使用超类型的原型的副本来作为子类型的原型,这样就避免了创建不必要的属性。
2.事件代理和事件委托?
- 事件代理 也就是 事件委托,不是直接给标签添加事件 是给标签的父级添加事件 通过 事件对象 判断触发事件的标签对象是谁 执行不同的函数程序的语法形式
- 委托的优点: 减少内存消耗、动态绑定事件
3.面向对象与面向过程的区别?
- 面向过程就是拆解出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
- 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
4.作用域、作用域链?
- (1)全局作用域
- 最外层函数和最外层函数外面定义的变量拥有全局作用域所有未定义直接赋值的变量自动声明为全局作用域
- (2)函数作用域
- 函数作用域声明在函数内部的变量,一般只有固定的代码片段可以访问到 作用域是分层的,内层作用域可以访问外层作用域,反之不行
- 作用域链: 在当前作用域中查找所需变量,如果在自己作用域找不到该变量就去父级作用域查找,依次向上级作用域查找,直到访问到window 对象就被终止,这一层层的关系就是作用域链。
5.垃圾回收机制?
- 垃圾回收是动态存储管理技术,会自动地释放"垃圾"(不再被程序引用的对象),按照特定的垃圾收集算法来实现资源自动回收的功能。
- 工作流程:
- 1.垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。
- 2.去掉环境中的变量以及被环境中的变量引用的变量的标记。
- 3.再被加上标记的会被视为准备删除的变量。
- 4.垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
- 常用的两种方法:
- 1.标记清除(make-and-sweep)
- 当变量进入执行环境是,就标记这个变量为“进入环境“。进入环境的变量所占用的内存就不能释放,当变量离开环境时,则将其标记为“离开环境“
- 垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉
- 在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了
- 引用计数 垃圾回收器会按照固定的时间间隔周期性的执行。
- 就是语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放
- 如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏
6.节流和防抖?
- 节流:节流是指当一个事件触发的时候,为防止事件的连续频繁触发,设置定时器,达到一种一段事件内只触发一次的效果,在当前事件内不会再次触发,当前事件结束以后,再次触发才有效.
- 防抖:防抖是指当一个事件触发的时候, 为防止频繁触发事件, 设置定时器,以达到一种 频繁触发期间不处理, 只有当最后一次连续触发结束以后才处理
7.Promise?
- Promise 是es6新增的一种异步编程的解决方案:promise是一个对象,承诺它过一段时间会给你一个结果,promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。
- promise是用来解决两个问题的:回调地狱,代码难以维护
8.Promsie 和 async await 的区别?
- Promise 允许链式调用和异步处理错误,但可能导致代码的可读性较差。
- async/await 提供了更简洁的语法,看起来像同步代码,同时提供了同步地处理错误的能力,增强了代码的可读性。
- 两者都是非阻塞的,但 async/await 提供了更好的错误处理和可读性
9.promise常用api?
- Promise.resolve(value) : 类方法,该方法返回一个以 value 值解析后的 Promise 对象
- Promise.reject : 类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected。
- Promise.prototype.then : 实例方法,为 Promise 注册回调函数,函数形式:fn(vlaue){},value 是上一个任务的返回结果,then 中的函数一定要 return 一个结果或者一 个新的 Promise 对象,才可以让之后的 then 回调接收。
- Promise.prototype.catch : 实例方法,捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛出的异常信息。
- Promise.race :类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败。
- Promise.all : 类方法,多个 Promise 任务同时执行,如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个 Promise 任务 rejected,则只返 回 rejected 任务的结果。
10.设计模式?
- 发布订阅模式: 这种设计模式可以大大降低程序模块之间的耦合度,便于更加灵活的扩展和维护。
- 中介者模式 :观察者模式通过维护一堆列表来管理对象间的多对多关系,中介者模式通过统一接口来维护一对多关系,且通信者之间不需要知道彼此之间的关系,只需要约定好API即可。
- 代理模式 :为其他对象提供一种代理以控制对这个对象的访问。代理模式使得代理对象控制具体对象的引用。代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西。
- 单例模式 :保证一个类只有一个实例,并提供一个访问它的全局访问点(调用一个类,任何时候返回的都是同一个实例)。
- 工厂模式 :工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型
- 装饰者模式 : 装饰者(decorator)模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责(方法或属性)。与继承相比,装饰者是一种更轻便灵活的做法。