前言
一直以来原型及原型链一直是前端开发避不开的一项知识点,本篇文章旨在通过题目,让大家更加清晰的对原型和原型链有一个更深入的了解,在开始讲题之前我会先讲解一下相关的知识点,帮助那些刚刚接触这些知识的同学们,如果已经了解过知识点,可以直接查看相关题目
什么是原型
在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。
什么是原型链
在JavaScript中万物都是对象,对象和对象之间也有关系,并不是孤立存在的。对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。
题目一
大家可以看下这个题目,试着给出答案
function A() {}
function B(a) {
this.a = a;
}
function C(a) {
if (a) {
this.a = a;
}
}
A.prototype.a = 1;
B.prototype.a = 1;
C.prototype.a = 1;
console.log(new A().a);
console.log(new B().a);
console.log(new C(2).a);
这道题的答案是 1, undefined, 2,下面讲解一下为什么会输出这些值:
new A().a会先去查找A的构造函数里面有没有a如果没有就会去它的原型上去找,这个时候A的prototype刚好有值,所以返回1
new B().a同理也会先去构造函数里面查找,这时候发现构造函数里面有值,就会直接返回this.a的值,同时因为没有给a赋值,所以返回undefind
new C(2).a因为给a赋值了,所以返回2
题目二
var F = function() {};
Object.prototype.a = function() {
console.log("a");
};
Function.prototype.b = function() {
console.log("b");
};
var f = new F();
F.a();
F.b();
f.a();
f.b();
这道题的答案是 a, b, a, 报错, 下面讲解一下为什么会输出这些值:
F.a()构造函数本身也是一种特殊的对象,当函数本身没有值得话,就会顺着原型链一直查找到Object,这个时候就会打印a
F.b()因为函数的原型上有b的函数,所以会输出b
f.a()的f为构造函数返回的实例,实例本身其实是个对象,所以f.a()在本身没有该方法时,会去查找Object上面有没有该方法,所以输出a
f.b()上面也说到了,实例是个对象,所以是不会去函数的原型上面查找的,所以b函数在原型链上其实是查不到的,所以报错
结语
上面就是相关原型链的知识及相关题目的讲解,要是觉得不错的话,欢迎手下留赞,如果有同学没看太懂,欢迎在下面评论,我看到时会一一解答的,我们一起成长进步!