面不面试的,你都得懂原型和原型链

引用类型,都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象:

const obj = {};

const arr = [];

const fn = function() {}

console.log(‘obj.proto’, obj.proto);

console.log(‘arr.proto’, arr.proto);

console.log(‘fn.proto’, fn.proto);

复制代码

image.png

规则三

引用类型,隐式原型 __proto__ 的属性值指向它的构造函数的显式原型 prototype 属性值:

const obj = {};

const arr = [];

const fn = function() {}

obj.proto == Object.prototype // true

arr.proto === Array.prototype // true

fn.proto == Function.prototype // true

复制代码

规则四

当你试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的隐式原型 __proto__(也就是它的构造函数的显式原型 prototype)中寻找:

const obj = { a:1 }

obj.toString

// ƒ toString() { [native code] }

复制代码

首先, obj 对象并没有 toString 属性,之所以能获取到 toString 属性,是遵循了第四条规则,从它的构造函数 Objectprototype 里去获取。

一个特例


我试图想推翻上面的规则,看下面这段代码:

function Person(name) {

this.name = name

return this // 其实这行可以不写,默认返回 this 对象

}

var nick = new Person(“nick”)

nick.toString

// ƒ toString() { [native code] }

复制代码

按理说, nickPerson 构造函数生成的实例,而 Personprototype 并没有 toString 方法,那么为什么, nick 能获取到 toString 方法?

这里就引出 原型链 的概念了, nick 实例先从自身出发检讨自己,发现并没有 toString 方法。找不到,就往上走,找 Person 构造函数的 prototype 属性,还是没找到。构造函数的 prototype 也是一个对象嘛,那对象的构造函数是 Object ,所以就找到了 Object.prototype 下的 toString 方法。

image.png

上述寻找的过程就形成了原型链的概念,我理解的原型链就是这样一个过程。也不知道哪个人说过一句,JavaScript 里万物皆对象。从上述情况看来,好像是这么个理。🤔

一张图片


用图片描述原型链:

image.png

最后一个 null,设计上是为了避免死循环而设置的, Object.prototype 的隐式原型指向 null

一个方法


instanceof 运算符用于测试构造函数的 prototype 属性是否出现在对象原型链中的任何位置。 instanceof 的简易手写版,如下所示:

// 变量R的原型 存在于 变量L的原型链上

function instance_of (L, R) {

// 验证如果为基本数据类型,就直接返回 false

const baseType = [‘string’, ‘number’, ‘boolean’, ‘undefined’, ‘symbol’]

if(baseType.includes(typeof(L))) { return false }

let RP = R.prototype; // 取 R 的显示原型

L = L.proto; // 取 L 的隐式原型

while (true) {

if (L === null) { // 找到最顶层

return false;

}

if (L === RP) { // 严格相等

return true;

}

L = L.proto; // 没找到继续向上一层原型链查找

}

}

复制代码

我们再来看下面这段代码:

function Foo(name) {

this.name = name;

}

var f = new Foo(‘nick’)

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

我们再来看下面这段代码:

function Foo(name) {

this.name = name;

}

var f = new Foo(‘nick’)

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值