原型链

prototype和__proto__

prototype: 显式原型

__ proto__: 隐式原型

一般,构造函数的prototype和其实例的__proto__是指向同一个地方的,这个地方就叫做原型对象 eg,

function Person(name, age) { // 这个就是构造函数
this.name = name
this.age = age
}
const person1 = new Person('小明', 20) // 这个是Person构造函数的实例
const person2 = new Person('小红', 30) // 这个也是Person构造函数的实例

函数

构造函数,其实他说到底也是个函数,其实咱们平时定义函数 都可以使用new Function来声明,是的没错Function也是一个构造函数。上面的写法等同于下面的写法

const fn1 = new Function('name', 'age', 'console.log(`我是${name}, 我今年${age}岁`)') fn1('林三心', 10
function fn1(name, age) { console.log(`我是${name}, 我今年${age}岁`) }

构造函数的原型与其实例的原型一致,故

console.log(Function.prototype === fn1.__proto__) // true

对象

创建一个对象,通常会用以下几种方法。

构造函数创建对象,他创建出来的对象都是此Function构造函数的实例,所以这里不讨论它

字面量创建对象

new Object创建对象

// 第一种:构造函数创建对象
function Person(name, age) {
  this.name = name
  this.age = age
}
const person1 = new Person('林三心', 10)
console.log(person1) // Person { name: '林三心', age: 10 }

// 第二种:字面量创建对象
const person2 = {name: '林三心', age: 10}
console.log(person2) // { name: '林三心', age: 10 }

// 第三种:new Object创建对象
const person3 = new Object()
person3.name = '林三心'
person3.age = 10
console.log(person3) // { name: '林三心', age: 10 }

// 第四种:Object.create创建对象
const person4 = Object.create({})
person4.name = '林三心'
person4.age = 10
console.log(person4) // { name: '林三心', age: 10 }

实例对象的__proto__指向Object构造函数的prototype

Function和Object

函数Function构造函数的实例

对象Object构造函数的实例

Function构造函数Object构造函数他们两个又是谁的实例呢?

function Object()其实也是个函数,所以他是Function构造函数的实例

function Function()其实也是个函数,所以他也是Function构造函数的实例,没错,他是他自己本身的实例

截屏2021-09-12 下午10.12.40.png

constructor

constructor和prototype是成对的,你指向我,我指向你。

截屏2021-09-12 下午10.35.40.png

原型链

Person.prototype 和 Function.prototype

Person.prototype,它是构造函数Person的原型对象

Function.prototype,他是构造函数Function的原型对象

都说了原型对象,原型对象,可以知道其实这两个本质都是对象

那既然是对象,本质肯定都是通过new Object()来创建的。既然是通过new Object()创建的,那就说明Person.prototype 和 Function.prototype都是构造函数Object的实例。也就说明了Person.prototypeFunction.prototype他们两的__proto__都指向Object.prototype

什么是原型链?

其实俗话说就是:__proto__的路径就叫原型链

截屏2021-09-12 下午10.55.48.png

原型链终点

咱们看到,三条原型链结尾都是Object.prototype,那是不是说明了Object.prototype就是原型链的终点呢?其实不是的,Object.prototype其实也有__proto__,指向null,那才是原型链的终点

原型示意图:

截屏2021-09-13 下午9.56.10.png

原型继承

不得不说补充一下原型继承这个知识点了,原型继承就是,实例可以使用构造函数上的prototype中的方法,在原型链上找。

instanceof

使用方法

A instanceof B

作用:判断B的prototype是否在A的原型链上

原型链练习题精解

原型链习题精解

参考

「原型链」,通俗易懂

阅读剩余
THE END