动画:《大前端吊打面试官系列》 之原生 JavaScript 精华篇( 六 )


① 基本思想:
② 优点:
③ 缺点:
原型继承
function object(o){function F(){}F.prototype = o;// 每次返回的 new 是不同的return new F();}var person = {friends : ["Van","Louis","Nick"]};// 实例 1var anotherPerson = object(person);anotherPerson.friends.push("Rob");// 实例 2var yetAnotherPerson = object(person);yetAnotherPerson.friends.push("Style");// 都添加至原型对象的属性(所共享)alert(person.friends); // "Van,Louis,Nick,Rob,Style"
**① 基本思想:**创建临时性的构造函数(无任何属性),将传入的对象作为该构造函数的原型对象,然后返回这个新构造函数的实例 。
② 浅拷贝:
所产生的对象是不相同的,但是原型对象都是对象,所改变存在原型对象的属性所有生成的实例所共享,不仅被所拥有,而且被子类生成的实例所共享 。
③ **.():**在中,通过新增 .() 方法规范化了上面的原型式继承. 。
寄生式继承
function createAnother(original){var clone = object(original); // 通过调用object函数创建一个新对象clone.sayHi = function(){ // 以某种方式来增强这个对象alert("hi");};return clone; //返回这个对象}
垃圾回收机制
说到 的垃圾回收机制,我们要从内存泄漏一步步说起 。
面试官:什么是内存泄漏?为什么会导致内存泄漏?
不再用到的内存,没有及时释放,就叫做内存泄漏 。
内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它 。导致了分配的这块内存永远也无法被释放出来 。如果这样的情况越来越多,会导致内存不够用而系统崩溃 。
面试官:怎么解决内存泄漏?说一说 JS 垃圾回收机制的运行机制的原理? 。
很多编程语言需要手动释放内存,但是很多开发者喜欢系统提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制" 。
之所以会有垃圾回收机制,是因为 js 中的字符串、对象、数组等只有确定固定大小时,才会动态分配内存,只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则, 的解释器将会消耗完系统中所有可用的内存,造成系统崩溃
与其他语言不同,它具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存 。
两种垃圾回收策略
找出那些不再继续使用的变量,然后释放其内存 。垃圾回收器会按照固定的时间间隔,周期性的执行该垃圾回收操作 。
共有两种策略:
标记清除法
垃圾回收器会在运行的时候,会给存储在内存中的所有变量都加上标记,然后它会去掉环境中变量以及被环境中的变量引用的变量的标记 。剩下的就视为即将要删除的变量,原因是在环境中无法访问到这些变量了 。最后垃圾回收器完成内存清除操作 。
它的实现原理就是通过判断一个变量是否在执行环境中被引用,来进行标记删除 。
引用计数法
引用计数的垃圾收集策略不常用,引用计数的最基本含义就是跟踪记录每个值被引用的次数 。
当声明变量并将一个引用类型的值赋值给该变量时,则这个值的引用次数加 1,同一值被赋予另一个变量,该值的引用计数加 1。当引用该值的变量被另一个值所取代,则引用计数减 1,当计数为 0 的时候,说明无法在访问这个值了,所有系统将会收回该值所占用的内存空间 。
存在的缺陷:
两个对象的相互循环引用,在函数执行完成的时候,两个对象相互的引用计数并未归 0 ,而是依然占据内存,无法回收,当该函数执行多次时,内存占用就会变多,导致大量的内存得不到回收 。