原型链高频面试题及解析.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

原型链高频面试题及解析

1.基础题:prototype和__proto__有什么区别?分别指向哪里?

答案:

两者都是原型链的核心,但作用对象和指向完全不同:

prototype:只有构造函数(比如functionPerson(){}、classPerson)才有这个属性,指向「该构造函数创建的所有实例的原型对象」(原型对象里通常放共享方法/属性)。

__proto__:所有实例对象(比如letp=newPerson())都有这个属性(非标准属性,标准里用Object.getPrototypeOf(实例)获取),指向「创建该实例的构造函数的prototype」。

举个代码例子更直观:

functionPerson(name){

this.name=name;

}

letp=newPerson(张三);

//关键关系:实例的__proto__===构造函数的prototype

console.log(p.__proto__===Person.prototype);//true

console.log(Object.getPrototypeOf(p)===Person.prototype);//标准写法,结果true

2.基础题:当访问一个对象的属性时,原型链的查找规则是什么?如果找不到会怎么样?

答案:

遵循「就近原则+向上查找」,具体步骤:

先查对象自身是否有该属性(比如p.name,先看p自己有没有name);

没有就通过__proto__找原型对象(即Person.prototype);

原型对象没有就继续通过原型对象的__proto__往上找(比如Person.prototype.__proto__指向Object.prototype);

直到找到Object.prototype,如果还没有,就找Object.prototype.__proto__(指向null,原型链终点),此时返回undefined(不会报错,除非访问undefined的属性才会报Cannotreadproperty)。

例子:

functionPerson(){}

Person.prototype.age=18;

letp=newPerson();

p.name=李四;

console.log(p.name);//自身有,输出李四

console.log(p.age);//自身没有,找原型,输出18

console.log(p.gender);//原型链查到底都没有,输出undefined

3.进阶题:如果重写了构造函数的prototype,实例的constructor会变吗?为什么?怎么修正?

答案:

会变!因为默认情况下,原型对象(Person.prototype)的constructor指向构造函数本身(Person),但如果直接重写prototype为新对象,新对象没有constructor属性,会从原型链继承Object.prototype.constructor(指向Object),导致实例的constructor错乱。

例子+修正:

functionPerson(){}

//错误:直接重写prototype

Person.prototype={

sayHi:function(){}

};

letp=newPerson();

console.log(p.constructor===Person);//false,实际指向Object

//正确:重写时手动指定constructor

Person.prototype={

constructor:Person,//关键:把constructor指回原构造函数

sayHi:function(){}

};

letp2=newPerson();

console.log(p2.constructor===Person);//true

实际开发注意:重写原型时必须手动修正constructor,否则后续用instanceof虽然还能用(pinstanceofPerson仍为true),但通过constructor判断类型会出错。

4.进阶题:用原型链实现「子类继承父类」的传统方式是什么?有什么缺点?

答案:

传统原型链继承的核心是「子类原型指向父类实例」,让子类实例能通过原型链访问父类的属性和方法。

实现代码:

//父类

functionParent(){

this.family=[爸爸,妈妈];//

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档