原型链
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构造函数
的实例,没错,他是他自己本身的实例
constructor
constructor和prototype是成对的,你指向我,我指向你。
原型链
Person.prototype 和 Function.prototype
Person.prototype,它是构造函数Person
的原型对象
Function.prototype,他是构造函数Function
的原型对象
都说了原型对象,原型对象,可以知道其实这两个本质都是对象
那既然是对象
,本质肯定都是通过new Object()
来创建的。既然是通过new Object()
创建的,那就说明Person.prototype 和 Function.prototype
都是构造函数Object
的实例。也就说明了Person.prototype 和 Function.prototype
他们两的__proto__
都指向Object.prototype
什么是原型链?
其实俗话说就是:__proto__的路径
就叫原型链
原型链终点
咱们看到,三条原型链结尾都是Object.prototype
,那是不是说明了Object.prototype
就是原型链的终点呢?其实不是的,Object.prototype
其实也有__proto__,指向null,那才是原型链的终点
原型示意图:
原型继承
不得不说补充一下原型继承
这个知识点了,原型继承
就是,实例
可以使用构造函数上的prototype
中的方法,在原型链上找。
instanceof
使用方法
A instanceof B
作用:判断B的prototype是否在A的原型链上
原型链练习题精解
参考