JS面向对象高频面试题及答案(实战接地气版)_第1页
JS面向对象高频面试题及答案(实战接地气版)_第2页
JS面向对象高频面试题及答案(实战接地气版)_第3页
JS面向对象高频面试题及答案(实战接地气版)_第4页
JS面向对象高频面试题及答案(实战接地气版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JS面向对象高频面试题及答案(实战接地气版)一、基础概念题(初级必问)1.说说你对JS面向对象的理解?JS的对象和其他语言有什么区别?参考答案:JS是一门基于对象、支持原型式面向对象的语言,和Java、C++这种基于类的面向对象不一样。1、JS里万物几乎都是对象(除了null、undefined、基础类型值),函数、数组、正则都是对象;2、JS没有真正的类,ES6的class只是语法糖,底层还是原型和构造函数实现的;3、JS的对象是动态可变的,可以随时增删属性和方法,编译期没有固定结构,这是和传统强类型语言最大的区别。2.什么是构造函数?普通函数和构造函数的区别?参考答案:专门用来创建对象、初始化对象属性的函数就是构造函数,规范上首字母大写。区别:1、调用方式不同:普通函数直接调用,构造函数必须用new调用;2、返回值不同:普通函数默认返回undefined,构造函数默认返回创建的实例对象;3、this指向不同:普通函数独立调用this指向window/undefined,构造函数的this指向新创建的实例;4、作用不同:普通函数用于执行逻辑,构造函数用于批量创建同类型对象。3.new关键字做了哪几件事?(高频必背)参考答案:new一个构造函数时,底层会自动执行4步:1、在内存中创建一个空的新对象;2、将新对象的__proto__指向构造函数的prototype原型对象;3、将构造函数内部的this,绑定为这个新对象,执行构造函数代码,给新对象添加属性和方法;4、如果构造函数没有手动返回引用类型(对象、数组、函数),就自动返回这个新实例对象;如果手动返回了引用类型,最终new的结果就是手动返回的值。二、原型&原型链核心题(面试重点)4.说说prototype和__proto__的区别?参考答案:简单说:prototype是函数的属性,__proto__是对象的属性。1、prototype(显式原型):只有函数才有,是构造函数的原型对象,用来存放所有实例共享的方法和属性,节省内存;2、__proto__(隐式原型):所有对象(实例)都有,指向创建它的构造函数的prototype;3、核心关系:实例.__proto__===构造函数.prototype。注意:开发中尽量不要直接操作__proto__,性能差且不规范,推荐用Object.getPrototypeOf()/Object.setPrototypeOf()。5.什么是原型链?原型链的查找规则是什么?参考答案:每个对象都有__proto__,指向自己的原型对象,而原型对象本身也是对象,也有自己的__proto__,层层向上查找,直到null,这条链式结构就是原型链。查找规则:访问对象的属性/方法时,先在自身对象查找,找到就直接用;没找到就顺着__proto__往原型上找,一层层向上,直到Ototype,最后到null,找不到返回undefined。6.原型、实例、构造函数三者的关系?参考答案:1、构造函数通过new创建实例对象;2、实例的__proto__指向构造函数的prototype;3、原型对象的constructor指向对应的构造函数;核心等式:实例.constructor===构造函数实例.__proto__===构造函数.prototype构造函数.prototype.constructor===构造函数7.原型上的属性和实例自身属性有什么区别?参考答案:1、自身属性:每个实例独立拥有,修改一个实例的自身属性,不会影响其他实例;占用内存多;2、原型属性/方法:所有实例共享,内存中只存一份;修改原型的属性方法,所有实例都会生效;3、优先级:自身属性优先级高于原型属性,同名属性会遮蔽原型属性。三、继承相关面试题(中高级核心)8.JS常见的继承方式有哪些?各自优缺点?参考答案:1、原型继承(子类原型=父类实例)优点:实现简单,共享父类原型方法;缺点:所有实例共享父类引用属性(数组、对象),一个实例修改,全部受影响;无法给父类传参。2、构造函数继承(call/apply)优点:解决了引用属性共享问题,可以给父类传参;缺点:无法继承原型方法,只能继承父类自身属性,方法只能写在构造函数内,无法复用。3、组合继承(原型继承+构造函数继承)【最常用ES5继承】优点:结合两者优点,既能传参,又能继承原型方法,不共享引用属性;缺点:父类构造函数执行两次,存在少量冗余。4、ES6classextends继承本质是组合继承的语法糖,底层还是原型继承;写法简洁、可读性高,支持super关键字,是现在主流写法。9.ES6class的特点是什么?和ES5构造函数有什么区别?参考答案:1、class是语法糖,底层依旧是原型、构造函数、原型链;2、class不存在变量提升,必须先定义再使用,ES5构造函数有提升;3、class内部默认严格模式;4、class的方法不可枚举,不会被for...in遍历到,ES5原型方法可枚举;5、class必须用new调用,直接调用会报错,ES5构造函数可以直接调用(this指向全局);6、class提供super、static静态方法、私有属性等特性,更规范。10.super关键字的作用?参考答案:1、在子类constructor中,super()必须先执行,才能使用this,作用是调用父类构造函数,继承父类属性;2、在子类普通方法中,super指向父类的原型对象,可以调用父类原型方法;3、只能在子类中使用,独立类、普通函数中使用会报错。四、手撕代码&坑点面试题(实战必考)11.说说instanceof的原理?自己手写一个instanceof?参考答案:原理instanceof用来判断构造函数的prototype是否出现在某个实例的原型链上,不是判断是不是自己创建的,只要在原型链上就返回true。手写实现:javascript

functionmyInstanceof(obj,fn){

//基础类型直接返回false

if(typeofobj!=='object'||obj===null)returnfalse

letproto=Object.getPrototypeOf(obj)

//顺着原型链向上遍历

while(proto){

if(proto===totype){

returntrue

}

proto=Object.getPrototypeOf(proto)

}

returnfalse

}12.为什么基本类型可以调用方法?比如'123'.toString()参考答案:因为JS有包装类机制。字符串、数字、布尔三种基本类型,在调用属性/方法时,JS会临时自动创建对应的包装对象(String、Number、Boolean),调用完方法后,临时对象立即销毁。所以基本类型本身没有方法,是临时包装对象提供的方法。13.静态属性/方法和实例方法的区别?参考答案:1、静态方法:用static修饰,挂载在类/构造函数本身,只能通过类调用,实例无法调用;一般用来写工具方法;2、实例方法:挂载在prototype原型上,只能通过实例对象调用,类本身无法调用;3、静态属性全局唯一,所有实例共享;实例属性每个实例独立。五、经典坑点面试题(面试官最爱问)14.原型链继承中,为什么子类原型要重置constructor?参考答案:子类原型赋值为父类实例后,子类原型的constructor会被覆盖为父类构造函数,导致实例的constructor指向错误。虽然不重置不影响继承逻辑,但会导致:实例.constructor判断出错、溯源混乱,不符合开发规范,所以必须手动修正子类原型的constructor指向自身。15.Object.create()的作用?和new有什么区别?参考答案:Object.create(proto)会创建一个空对象,并将这个空对象的__proto__指向传入的proto原型。和new的区别:1、new会执行构造函数,初始化属性;Object.create不会执行任何构造函数,只绑定原型;2、new创建的实例有自身构造函数属性;Object.create创建的对象默认没有自身属

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论