前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >经常会采坑的js原型应试题

经常会采坑的js原型应试题

原创
作者头像
loveX001
发布2022-12-12 09:31:51
3030
发布2022-12-12 09:31:51
举报
文章被收录于专栏:前端开发面试

一. 前言

原型和原型链在面试中历来备受重视,经常被提及。说难可能也不太难,但要真正完全理解,吃透它,还是要多下功夫的。

下面为大家简单阐述我对原型和原型链的理解,若是觉得有说的不对的地方,还请帮忙指正,或者关闭页面不浪费您的宝贵时间(害怕)

二. 正文

原型

  1. JavaScript所有的对象本质上都是通过new 函数创建的,包括对象字面量的形式定义对象(相当于new Object()的语法糖)。
  2. 所有的函数本质上都是通过new Function创建的,包括ObjectArray等 (隐式执行,是我们看不到的但在执行过程中发生过的)
  3. 所有的函数都是对象。

剖析

Prototype(显式原型)

222.png
222.png

每个函数都有一个属性prototype,它就是原型,默认情况下它是一个普通Object对象,这个对象是调用该构造函数所创建的实例的原型。

__proto__(谷歌浏览器已更新为[[prototype]],隐式原型)

JavaScript中所有对象(除了null)都具有一个__proto__属性,该属性指向该对象的原型。

上图中,函数身上的属性,会被显式的继承到,即 //this.name=’wn’, 此时显式的不存在,所以继承不到,但是函数的原型上有属性,就会被隐式的继承到,即

[Prototype]: Objectundefinedname: "小南"

contructor属性

333.png
333.png

JavaScript同样存在由原型指向构造函数的属性:constructor,即Func.prototype.constructor --> Func

原型链

实例对象在查找属性时,如果查找不到,就会沿着__proto__去与对象关联的原型上查找,如果还查找不到,就去找原型的原型,直至查到最顶层,这也就是原型链的概念。

原型树状图.png
原型树状图.png

参考 前端进阶面试题详细解答

通过这张图我们可以注意到,构造函数Foo的原型prototype 和 构造函数Foo所创建出来的对象实例f1,f2的原型__proto__是一样的都指向Foo().prototype.

这里我们可以继续思考,往下探索一下,既然Foo().prototype也是一个对象,那是不是Foo().prototype也有自己的对象原型__proto__呢.答案是肯定的,图中我们也可以看到Foo().prototype的对象原型__proto__指向的是Object.prototype. Object作为最顶端的构造函数,可以看到所有的对象都会通过原型链指向它.这就是为什么新建的对象为什么能够使用 toString() 等方法的原因.

但是我们可以发现Object.prototype也有自己的__proto__ 但是却指向的是null,null为原型链的终点.

注意!!!

那么这里还个问题,细心的小伙伴已经发现了,构造函数有自己的原型prototype,但是构造函数也是对象啊,构造函数也有没有__proto__呢.答案是有的.因为每个 JavaScript 函数实际上都是一个 Function 对象。运行 function(){}).constructor === Function // true 便可以得到这个结论。

而且通过图我们也可以发现 Foo__proto__指向Function.prototype,而且这里还有个特例,上文也说明了每个 JavaScript 函数实际上都是一个 Function 对象,所以Function的构造函数原型prototype和对象原型__proto__都是指向同一个Function.prototype.

结语

原型和原型链算是js里的一座大山,比较偏概念性,在面试时是经常出现的,所以闲时可以多拿出来琢磨。

鄙人写的也略有浅显,希望能帮到查阅的小伙伴呀。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 前言
  • 二. 正文
    • 原型
      • 剖析
        • Prototype(显式原型)
        • __proto__(谷歌浏览器已更新为[[prototype]],隐式原型)
        • contructor属性
      • 原型链
        • 注意!!!
    • 结语
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档