首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么原型继承是高效的,并且比闭包消耗更少的内存?

原型继承是一种面向对象编程中的继承方式,它通过共享原型对象来实现对象之间的属性和方法的继承。相比于闭包,原型继承具有高效和较少内存消耗的优势,原因如下:

  1. 共享原型对象:在原型继承中,子对象通过指向父对象的原型对象来继承属性和方法。这意味着多个子对象可以共享同一个原型对象,而不需要为每个子对象都创建一份独立的属性和方法副本。这样就节省了内存空间,尤其是当存在大量子对象时。
  2. 原型链查找:原型继承通过原型链的方式进行属性和方法的查找。当子对象需要访问某个属性或方法时,它会首先在自身的属性和方法中查找,如果找不到则会沿着原型链向上查找,直到找到对应的属性或方法或者到达原型链的顶端。这样的查找方式相对于闭包的作用域链查找更加高效,因为原型链的结构是简单且扁平的。
  3. 动态更新:原型继承中,原型对象的属性和方法可以在运行时进行动态更新,而这些更新会立即反映在所有继承自该原型对象的子对象上。这种动态性使得原型继承在开发过程中更加灵活和高效,无需重新创建对象或者重新定义闭包。

总结起来,原型继承之所以高效并且比闭包消耗更少的内存,是因为它通过共享原型对象、原型链查找和动态更新等机制来实现属性和方法的继承,从而节省了内存空间并提高了查找效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JS温故知新

# JS垃圾回收机制   项目中,如果存在大量不被释放的内存(堆/栈/上下文),页面性能会变得很慢。当某些代码操作不能被合理释放,就会造成内存泄漏。我们尽可能减少使用闭包,因为它会消耗内存。...可以看出闭包是函数作用域下的产物,闭包会随着外层函数的执行而被同时创建,它是一个函数以及其捆绑的周边环境状态的引用的组合。换而言之,闭包是内层函数对外层函数变量的不释放。...所以使用闭包会消耗内存、不正当使用会造成内存溢出的问题,在退出函数之前,需要将不使用的局部变量全部删除。...如果不是某些特定需求,在函数中创建函数是不明智的,闭包在处理速度和内存消耗方面对脚本性能具有负面影响。...原型链:函数的原型链对象constructor默认指向函数本身,原型对象除了有原型属性外,为了实现继承,还有一个原型链指针__proto__,该指针是指向上一层的原型对象,而上一层的原型对象的结构依然类似

50460

从Javascript到Typescript到Node.js

闭包 闭包在Javascript里是很重要的概念,很多实现机制都会利用这点。闭包由function确立,子闭包可以访问外部的变量,但是外部的不能访问字闭包内的成员。...每一个function都可以通过设置prototype成员指定它的类型原型实例,要注意这里是原型的实例而不是原型的类型。...eval eval函数的作用闭包是当前闭包,所以执行完 eval('var abc = 123;'); 之后,abc就变成Number类型的值为123的东东了,后面也可以用到。...模块Module module关键字用于声明模块,其实就是Javascript里的闭包啦,需要注意的是module里的默认的东西都是*private*的,也就是用*var*申明的,如果要把它变成public...它采用了Javascript回调那种优雅的设计模式,最初是为了解决高连接数下的服务器性能消耗问题。并且其申称不会用锁,所以不会有死锁。

2.4K20
  • 前端面试(2)javascript

    继承: 继承:利用原型让一个引用类型继承另一个引用类型的属性和方法,并且将原型链作为实现继承的主要方法。 继承一般有 2 种:接口继承和实现继承。接口继承只继承方法签名,实现继承则继承实际的方法。...优缺点:这个例子的高效率体现在它只调用了一次SuperType 构造函数,并且因此避免了在SubType.prototype 上创建不必要的、多余的属性。...、垃圾回收和内存泄漏 定义: 闭包就是能够读取其他函数内部变量的函数。...三、闭包的用途 闭包可以用在许多地方。它的最大用处有两个 一个是前面提到的可以读取函数内部的变量 另一个就是让这些变量的值始终保持在内存中。...四、使用闭包的注意点 1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在 IE 中可能导致内存泄露。

    1.3K20

    36个助你成为专家需要掌握的JavaScript概念

    简单地说,它检查一个对象是否是另一个对象的实例。 这将帮助你理解对象如何相互继承。继承是通过原型实现的。...简单地说,原型就是JavaScript对象从其继承方法和属性的对象。 通过更好地理解原型,你可以构建高效、快速的应用程序。...如果你改变一个变量,根据它改变之前的值,它可能会影响其他函数。在react环境中,建议你不要改变你的状态。这里有一个关于不变性很好的文章。 21、闭包 闭包很难理解。...但是一旦理解了,你就会开始看到JavaScript的美了。网上有丰富的资源。只要确保你花时间学习闭包。 闭包允许你在内部作用域中访问外部函数的作用域。...每次创建函数时,都会创建JavaScript闭包。 了解应该使用闭包的原因,以便更深入地理解它们。 22、高阶函数 高阶函数是以其他函数作为参数或返回函数的函数。高阶函数让合成释放出最大的能量。

    71220

    分享63个最常见的前端面试题及其答案

    03、解释原型继承如何工作 原型继承允许一个对象通过建立原型链来继承另一个对象的属性。 04、null、未定义或未声明的变量之间有什么区别?...‘null’表示故意不存在任何对象值,‘undefined’表示声明的变量没有赋值,未声明的变量根本不声明。 05、什么是闭包,以及如何/为什么使用闭包?...闭包是在函数返回后保持对函数中变量的访问的一种方式。闭包通常用于数据隐私、封装和创建具有持久状态的函数。...55、什么时候经典继承是合适的选择? 经典继承通常用在像 Java 或 C# 这样的语言中,这些语言需要严格的类层次结构,并且对象之间的关系是固定的和层次化的。...当设计具有明确定义的类结构和继承关系的复杂系统时,它可能是合适的。 56、什么时候原型继承是合适的选择? 当灵活性和对象组合比严格的类层次结构更重要时,原型继承适用。

    8.5K21

    分享 63 道最常见的前端面试及其答案

    03、解释原型继承如何工作 原型继承允许一个对象通过建立原型链来继承另一个对象的属性。 04、null、未定义或未声明的变量之间有什么区别?...‘null’表示故意不存在任何对象值,‘undefined’表示声明的变量没有赋值,未声明的变量根本不声明。 05、什么是闭包,以及如何/为什么使用闭包?...闭包是在函数返回后保持对函数中变量的访问的一种方式。闭包通常用于数据隐私、封装和创建具有持久状态的函数。...55、什么时候经典继承是合适的选择? 经典继承通常用在像 Java 或 C# 这样的语言中,这些语言需要严格的类层次结构,并且对象之间的关系是固定的和层次化的。...当设计具有明确定义的类结构和继承关系的复杂系统时,它可能是合适的。 56、什么时候原型继承是合适的选择? 当灵活性和对象组合比严格的类层次结构更重要时,原型继承适用。

    34930

    前端面试宝典 v1

    闭包,循环 51、javascript对象的几种创建方式? 1. 工厂模式 2. 构造函数模式 3. 原型模式 4. 混合构造函数和原型模式 5. 动态原型模式 6. 寄生构造函数模式 7....call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。 58、简述一下JS中的闭包? 闭包用的多的两个作用:读取函数内部的变量值;让这些变量值始终保存着(在内存中)。...同时需要注意的是:闭包慎用,不滥用,不乱用,由于函数内部的变量都被保存在内存中,会导致内存消耗大。 59、说说你对this的理解?...事件处理机制:IE是事件冒泡、火狐是 事件捕获; 3. ev.stopPropagation(); 75、什么是闭包(closure),为什么要用?...这是对闭包作用的非常直白的描述.

    2.4K41

    js面试知识点笔记

    =>谈谈你对闭包的理解 闭包是JS中一个非常重要的机制,我们很多编程思想、业务逻辑、设计模式都是基于闭包完成的,先说一下我对闭包的理解:闭包就是函数执行产生一个私有的作用域(不销毁),在这个作用域中的私有变量和外界互不干扰...,但是闭包比较占内存,我会尽量减少对它的使用,但是有些需求必须要用 如下一个字符串 “54389”,要求将字符串中的阿拉伯数字替换成我们的中文大写数字”伍肆叁捌玖”,请使用正则的方式进行处理 let str...… DNS及HTTP通信方式的优化 1.在JS中尽量减少闭包的使用(原因:闭包会产生不释放的栈内存) A:循环给元素做事件绑定的时候,尽可能的把后期需要的信息(例如索引)存储到元素的自定义属性上,...而不是创建闭包存储 B:可以在最外层形成一个闭包,把一些后续需要的公共信息进行存储,而不是每一个方法都创建闭包(例如单例模式) C:尽可能的手动释放不被占用的内存 … 2.尽量合并CSS和JS文件...,避免由于递归导致的栈内存嵌套(建议使用尾递归) 27.避免使用iframe(不仅不好管控样式,而且相当于在A页面中加载了其它页面,消耗较大) 28.利用H5中提供的localstorage本地存储或者是

    98820

    JavaScript 性能优化

    加载与执行 将标签放在前面,不要放在中,防止造成堵塞 尽量减少请求,单个100KB的文件比4个25KB的文件更快,也就是说减少页面中外链的文件会改善性能 尽量使用压缩过的...JS文件,体积更小,加载更快 数据存取 使用局部变量和字面量比使用数组和对象有更少的读写消耗 尽可能使用局部变量代替全局变量 如无必要,不要使用闭包;闭包引用着其他作用域的变量,会造成更大的内存开销 原型链不要过深...,完成后再替换原始元素 算法和流程控制 改善性能最佳的方式是减少每次迭代的运算量和减少循环迭代次数 JavaScript四种循环中for while do-while for-in,只有for-in循环比其他其中明显要慢...,因为for-in循环要搜索原型属性 限制循环中耗时操作的数量 基于函数的迭代forEach比一般的循环要慢,如果对运行速度要求很严格,不要使用 if-else switch,条件数量越大,越倾向于使用...中性能非常快,可以使用位运算来代替纯数学操作 x =* x // 用位运算代替 x <<= 1 如无必要,不要重写原生方法,因为原生方法底层是用C/C++实现的,速度更快 参考资料 高性能JavaScript

    1K20

    web前端常见面试题归纳

    谈谈对闭包的认识 闭包的概念 一个函数访问了此函数的父级及父级以上的作用域中的变量,这个函数就是闭包。本质上,js中的每个函数都是一个闭包,因为每个函数都可以访问全局变量。一般理解为函数嵌套函数。...闭包的作用 访问函数内部的变量 让变量始终保持在内存中 闭包的优点 可以减少全局变量的定义,避免全局变量的污染 能够读取函数内部的变量 在内存中维护一个变量,可以用作缓存 闭包的缺点 造成内存泄漏:变量驻留内存...对继承的看法 继承的概念 父类的属性和方法可以被子类继承,子类可以调用父类的属性和方法 前端常用的继承方式 继承方式 优点 缺点 原型和原型链继承:把实例的父类给子函数的原型 优点:1、非常纯粹的继承关系...,内存消耗过大。...事件代理的优点 减少事件的定义,减少内存消耗 可以为DOM操作的元素动态绑定事件。

    99420

    【面试题解】初识 JavaScript 闭包

    是号称 JS 面试三座大山(原型与原型链,作用域及闭包,异步和单线程)其中的一座山。 很多高级应用都需要依靠闭包来实验,包括我们去看很多的 JS 库和框架的源码,都少不了闭包的影子。...定义 闭包就是能够读取其它函数内部变量的函数。 为什么我们要借助闭包来 读取其它函数内部的变量 呢?...根据闭包的定义,闭包就是能够读取其它函数内部变量的函数,那么以上两种方式是闭包么?如果不是,他们都能拿到局部变量的值,并且更简单,为什么还要用闭包呢?...到这里之前留下的思考题就已经有答案了。闭包是一个能够读取其它函数内部变量的函数,但是能够读取其它函数内部变量的函数不一定就是闭包,为什么需要闭包,因为闭包 即可以长久的保存变量,又不会造成全局污染。...通常情况下,函数的活动对象会随着执行的上下文环境一起被销毁,但是由于闭包引用的是外部函数的活动对象,因此这个活动对象无法被销毁,这意味着闭包比普通函数要消耗更多的内存。

    22710

    JS高级部分

    执行上下文 执行栈 作用域 作用域链 闭包 闭包的定义 闭包的优点 闭包的作用 闭包的生命周期 闭包的应用---JS模块 闭包的缺点 内存溢出与内存泄露 变量保存外部this JS对象创建方式...---- 作用域 作用域链 ---- 闭包 闭包的定义 ---- 闭包的优点 1、让外部访问函数内部变量成为可能 2、局部变量会常驻在内存中 3、可以避免使用全局变量,防止全局变量污染 4、会造成内存泄漏...(有一块内存空间被长期占用,而不被释放) ---- 闭包的作用 变量f得到的是fn1返回的函数的地址值,fn3变量名被释放了,但是其所指向的地址又被f接收了,因此这块地址上的函数对象,没有成为垃圾对象被回收...,然后调用返回得到返回值执行即可 JS模块定义方式二: 这样js文件加载,我们通过myMoudle2.属性名()就可以直接调用函数 ---- 闭包的缺点 ---- 内存溢出与内存泄露...---- 继承 原型链的继承 原型链的继承要点: 将对应的父类型的实例对象变为子类型的原型对象 当实现了原型链继承效果后,子类型原型的constructor指向的是刚才的添加进原型链的Supper

    99431

    JavaScript 知识点整理

    如何让子类继承父类呢?不扯别的,直接告诉你。JavaScript通过原型链来实现继承! 如何构建原型链呢?将父类实例赋值给子类构造函数的原型即可。好绕,但是千万得记住了! ?...原型链继承 构建原型链之后,子类就可以访问父类的所有属性和方法!...我们通常是因为被闭包坑了,才会被闭包吓到,尤其是面试题里一堆闭包。 闭包的定义前面提了,如何创建闭包也说了,那么我们说说闭包的缺陷以及如何解决?...而为了解决这个坑,我们常用的方式就是让函数表达式自执行。 此外,由于闭包引用了祖先函数的作用域,所以滥用闭包会有内存问题。 好像把闭包说得一无是处,那么闭包有什么用处呢? 主要是封装吧......✦ 面向对象编程的部分外面有很多种方式,你只需要记住使用构造函数+原型去定义一个类,使用原型链去实现继承即可。更多的扩展,去翻翻书吧。 ✦ 函数表达式引出了几个比较好玩的东西:递归、闭包、封装。

    84850

    【面试】386- JavaScript 面试 20 个核心考点

    3.闭包是什么 闭包这个概念也是JavaScript中比较抽象的概念,我个人理解,闭包是就是函数中的函数(其他语言不能这样),里面的函数可以访问外面函数的变量,外面的变量的是这个内部函数的一部分。...闭包的作用: 使用闭包可以访问函数中的变量。 可以使变量长期保存在内存中,生命周期比较长。 闭包不能滥用,否则会导致内存泄露,影响网页的性能。闭包使用完了后,要立即释放资源,将引用变量指向null。...这种继承方式优点在于构造函数可以传参,不会与父类引用属性共享,可以复用父类的函数,但是也存在一个缺点就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6中class 的继承 ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多...需要注意的是,class关键字只是原型的语法糖,JavaScript继承仍然是基于原型实现的。

    46810

    2020年前端面试题及答案_结构化面试题库及答案

    3、什么是闭包?闭包有什么特性? 闭包就是能够读取其他函数内部变量的函数。...使用闭包就是为了设置私有变量和方法。 闭包的好处:能够实现封装和缓存; 闭包的坏处:就是内存消耗,使用不当可能会造成内存溢出的问题。 5、说说this对象的理解?...创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型; 属性和方法被加入到this引用的对象中; 新创建的对象由this所引用,并且最后隐式地返回this。...数据类信、运算、对象、Function、继承、闭包、作用域、原型链、事件、RegExp、JSON、Ajax、DOM、BOM、内存泄露、跨域、异步装载、模板引擎、前端MVC、路由、模块化、Canvas、ECMAScript...setTimeout的第一个参数是字符串而非函数的话,会造成内存泄漏; 闭包使用不当。 24、介绍JS有哪些内置对象?

    2.5K20

    横扫 JS 面试核心考点

    闭包是什么? 闭包这个概念也是JavaScript中比较抽象的概念,我个人理解,闭包是就是函数中的函数(其他语言不能这样),里面的函数可以访问外面函数的变量,外面的变量的是这个内部函数的一部分。...闭包的作用: 使用闭包可以访问函数中的变量; 可以使变量长期保存在内存中,生命周期比较长。 闭包不能滥用,否则会导致内存泄露,影响网页的性能。闭包使用完了后,要立即释放资源,将引用变量指向null。...这种继承方式优点在于构造函数可以传参,不会与父类引用属性共享,可以复用父类的函数,但是也存在一个缺点就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6中class的继承 ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多...需要注意的是,class关键字只是原型的语法糖,JavaScript继承仍然是基于原型实现的。

    1.5K03

    2021前端高级面试题_2021前端面试题目100及最佳答案

    监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断 2、什么是闭包 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。...3、继承有哪些方法 原型链继承 借用构造函数继承(伪造对象、经典继承) 实例继承(原型式继承) 组合式继承 寄生组合继承 es6继承 extends 4、什么是深/浅拷贝,有哪些实现方式...–>当前原型中查找 原型链的最顶端是null 30.闭包 闭包就是指有权访问另一个函数作用域中的变量的函数 MDN 上面这么说:闭包是一种特殊的对象。...②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存) ③匿名自执行函数可以减少内存消耗 闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。...如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。 31.Vue和React的区别是什么?

    81420

    JavaScript 知识点整理

    如何让子类继承父类呢?不扯别的,直接告诉你。JavaScript通过原型链来实现继承! 如何构建原型链呢?将父类实例赋值给子类构造函数的原型即可。好绕,但是千万得记住了! ?...原型链继承 构建原型链之后,子类就可以访问父类的所有属性和方法!...我们通常是因为被闭包坑了,才会被闭包吓到,尤其是面试题里一堆闭包。 闭包的定义前面提了,如何创建闭包也说了,那么我们说说闭包的缺陷以及如何解决?...而为了解决这个坑,我们常用的方式就是让函数表达式自执行。 此外,由于闭包引用了祖先函数的作用域,所以滥用闭包会有内存问题。 好像把闭包说得一无是处,那么闭包有什么用处呢? 主要是封装吧......✦ 面向对象编程的部分外面有很多种方式,你只需要记住使用构造函数+原型去定义一个类,使用原型链去实现继承即可。更多的扩展,去翻翻书吧。 ✦ 函数表达式引出了几个比较好玩的东西:递归、闭包、封装。

    73250

    JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

    1.2、理解闭包 闭包概念:当一个内部函数被调用,就会形成闭包,闭包就是能够读取其他函数内部变量的函数,定义在一个函数内部的函,创建一个闭包环境,让返回的这个子程序抓住i,以便在后续执行时可以保持对这个...它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。 为什么会这样呢?...1.4、小结 闭包就是使用外部函数内部变量的函数 注意事项: 1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。...解决方法是,在退出函数之前,将不使用的局部变量全部删除。 2)闭包会在父函数外部,改变父函数内部变量的值。...每个对象都链接到一个原型对象,并且可以从中继承属性,所有通过常量(字面量)创建的对象都连接到Object.prototype,它是JavaScript中的顶级(标配)对象,类似高级语言中的根类。

    1.5K60

    八年phper的高级工程师面试之路八年phper的高级工程师面试之路

    产生泄漏的原因是闭包维持函数内局部变量,不能被释放,尤其是使用闭包并存在外部引用还setInterval的时候危害很大。 备注:我觉得这块回答并不好,因为肯定不是闭包的原因。...3、什么是闭包,跟原型链、作用域链有什么关联 答:闭包是指存在于一个作用域链分支的函数域内的函数,该函数可以向上逐级访问作用域链上的变量,直到找到为止。...当闭包存在外部引用时,js会维持闭包自身以及所在函数作用域链的内存状态。 备注:这个是我自己瞎说的。...继续答:跟原型链没有什么关联,函数的原型(prototype)主要用于实现继承,原型链可用于追溯继承关系,与作用域链类似,都是向上逐级访问属性,直到被找到,原型链的顶层是null,可以理解为所有的object...再问:内存比较宝贵,在不用内存加锁的情况下怎么办,并且如果碰到1亿奖池的情况,预先插入数据库肯定不好,怎么办?

    2K20
    领券