-
函数是Function构造函数的实例对象
-
对象是Object构造函数的实例对象
-
Function构造函数是Function构造函数的实例对象
-
Object构造函数是Function构造函数的实例对象
-
函数都存在显式原型prototype,显式原型是对象
-
对象都存在隐式原型__proto__ ,隐式原型指向其构造函数的显式原型
一、原型
1、prototype和__proto__
prototype:显示原型(在js中,所有的函数都有显示原型,显示原型是一个对象)__proto__:隐式原型(在js中,所有的对象都有隐式原型,隐式原型指向该对象的构造函数的显示原型)
2、prototype和__proto__之间的关系
- 构造函数的
prototype与其实例(对象) 的__proto__是指向同一个地方,这个地方就叫做原型对象,也就是xxx.prototype是原型对象,而__proto__是起链接作用,xxx.prototype相当于一个公共区域,可以为继承它的子代提供属性和方法
3、构造函数、函数、对象(简单的解释方便理解原型)
- 构造函数简单的说就是可以
new的函数,默认会首字母大写,(箭头函数不能用来当作构造函数)
//Animal构造函数
function Animal() {
this.name = name
}
//Animal原型对象
Animal.prototype = {
id: "Animal",
sleep: function () {
let a = 1
a++
return a
}
}
//通过new实例化一只旺财一只咪咪,
let dog = new Animal("旺财")
let cat = new Animal("咪咪")
console.log(Animal,"Animal");
console.log(dog,"dog");
console.log(cat,"cat");
- 函数可以简单理解为通过
new Function()实例化得到的(例如:具名函数、匿名函数、箭头函数)
function fn() {},
const fn = new Function() {},
const fn1 = function() {},
const fn1 = new Function() {},
const fn2 = () => {}
const fn2 = new Function() {},
- 对象可以简单理解为通过
new Object()实例化得到的(当然上文中旺财和咪咪也是Animal的实例化对象)
let obj = {}
let obj = new Object()
4、Function与Object
- 需要理解
Function与Object是构造函数,那么本质上还是函数,既然是函数那么它们就是由Function实例化而来的对象,所以就可以理解为什么Function与Object同时存在prototype和__proto__
二、原型链
- 图中粉色组成的链状结构就是原型链
- 当我们需要查找一个对象的某个属性的时候,首先会在自身属性上查找,如果没有,则会沿着就近的
__proto__这个隐式原型查找,即指向它的父函数的prototype,如果仍然没有找到,则会继续沿着父函数的prototype属性的__proto__指向的再上一层函数中查找,这样一层一层向上形成一个链式结构。叫做原型链。