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

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

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

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

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

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

相关·内容

JS温故知新

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

50360

从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.2K20

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

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

    71220

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

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

    34130

    前端面试宝典 v1

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

    2.4K41

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

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

    6.8K21

    js面试知识点笔记

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

    98620

    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操作元素动态绑定事件。

    98820

    【面试题解】初识 JavaScript

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

    22410

    JS高级部分

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

    99231

    JavaScript 知识点整理

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

    84350

    JavaScript 面试 20 个核心考点

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

    40910

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

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

    2.5K20

    JavaScript 知识点整理

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

    73150

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

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

    46010

    横扫 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区别是什么?

    80120

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

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

    2K20
    领券