前端面试js原型和原型链

tech2022-08-05  150

前言:

与大部分面向对象语言不同,ES6之前中并没有引入类(class)的概念,JavaScript并非通过类而是直接通过构造函数来创建实例。在介绍原型和原型链之前,我们有必要先复习一下构造函数的知识。

1、原型:

function Person(name) { this.name = name; } Person.prototype.say = function() { console.log('hello ' + this.name); } let p1 = new Person('张三'); let p2 = new Person('李四');p1.say(); // hello 张三 p2.say(); // hello 李四 console.log(p1.say === p2.say); // true

**这里的原型就是 ---- Person.prototype **

函数有原型,函数有一个属性叫prototype,函数的这个原型指向一个对象,这个对象叫原型对象。这个原型对象有一个constructor属性,指向这个函数本身。 js规定每一个函数都有一个proto属性,而且对应的是自身的原型,

在js函数对象除了proto之外还有prototype属性,当函数作为构造函数创建实例时,该属性就被作为实例对象的原型,并且这个属性是一个对象数据类型的值。

一张图就可以表示构造函数和实例原型之间的关系: 原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。


2、原型链:

当一个对象调用自身不存在的属性和方法时就会去自己的proto的前辈prototype对象上去找,如果没找到就会去prototype的前辈上去找 直到找到或者返回undefiend 这个查找的过程就是原型链

举例说明:person → Person → Object ,普通人继承人类,人类继承对象类

我们可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性;使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true

顶层对象:

最顶层的原型对象:object.prototype object.prototype最常用的两种方法(tostring 、valueof)

拓展

隐式原型 (proto):隐式原型的作用是用来构成原型链,实现基于原型的继承

显式原型(prototype):用来实现基于原型的继承与属性的共享

最新回复(0)