浅谈javascript的原型和原型链(新手懵懂想学会原型链?看这篇文章就足够啦!!!)

本文最后更新于:2022年2月18日 中午

本篇文章我将从概念和对应题目知识点讲起,希望大家能有所收获


一、原型

①所有引用类型都有一个_proto_(隐式原型)属性(类似链表中的next指针), 链表可以通过.next访问下个元素,原型中可通过._proto_访问上一级元素。
在这里插入图片描述

②所有类都有一个prototype(原型)属性,例如:Object,Function,Array

③所有引用类型的_proto_属性指向它构造函数的prototype
例如:arr是一个数组实例,那么arr._proto_=Array.prototype


二、原型链

当访问一个对象的某个属性时,会先在这个对象本身上查找,如果没有找到,则会去它的_proto_上查找,即它的构造函数的prototype,如果还没有找到就会继续在构造函数prototype的_proto_中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

下面例子有助于你对原型链的理解:

arr为Array数组的实例

arr._proto_=Array.prototype

Array._proto_=Object.prototype

分析:arr这个数组实例,沿着原型链找,找到数组的原型对象,数组这个类沿着原型链找,找到对象的原型对象(最高级),因此也可以用arr._proto_._proto_来找到Object.prototype,类似链表中的next指针,只不过_proto_是往上找。


面试真题:

题目一:
instanceof的原理,并用代码实现



分析:如果A沿着原型链能找到B.prototype,那么A instanceof B 为true(用_proto_来找)

解法:遍历A的原型链,如果找到B.prototype,返回true,否则返回false

1
2
3
4
5
6
7
8
9
10
const instanceof =(A,B)=>{
let p = A;
while(p){
if(p === B.prototype){
return true;
}
p = p._proto_;
}
return false;
}

题目二:

var foo = {}, F = function(){};

Object.prototype.a = ‘value a’;

Function.prototype.b = ‘value b’;

console.log(foo.a);
console.log(foo.b);
console.log(F.a);
console.log(F.b);


分析:如果在A对象上没找到x属性,那么会沿着原型链找x属性。(如果A为函数实例,那么A上面找不到,就去找Function这个类上有没有挂载x属性,如果没有就继续往上找到Object原型对象上有没有x属性)

解法:明确foo和F变量的原型链,沿着原型链找a属性和b属性

因此答案为:

1
2
3
4
'value a'
'undefined'
'value a'
'value b'

foo这个对象实例上没有b属性,是因为原型链不能往下找,只能一层一层往上找,即对象实例不能腆着脸问他的下级Function有没有挂载b这个属性




觉得本篇文章对你有帮助的请不要忘记一键三连加关注~~

你的支持就是对我最大的动力!!

会继续努力码更多的精品文章!!!


作者:Smooth

文章链接:http://example.com/2022/02/11/%E6%B5%85%E8%B0%88javascript%E7%9A%84%E5%8E%9F%E5%9E%8B%E5%92%8C%E5%8E%9F%E5%9E%8B%E9%93%BE/

版权说明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!