一图了解原型链
前言:
每个函数创建时,都会按照特定的规则:
-
创建一个
prototype
属性(指向原型对象); -
默认情况下,所有原型对象会自动获得一个
constructor属性
,指向与之关联的构造函数; -
自定义构造函数时,原型对象**会默认获得
constructor
属性,其他所有方法都继承自Object
; -
每次调用构造函数创建新实例,实例内部的
[[Prototype]]
指针就会被赋值为构造函数的原型对象,脚本中没有访问该特性的方法,但在Safari、Chrome、Firefox中会在每个对象上暴露__proto__
属性,能通过这个属性访问对象的原型;
functon Foo(){}
let f1 = new foo();
let f2 = new foo();
[图片上传失败...(image-2df68f-1619447723275)]
-
构造函数<mark>
Foo()
</mark>构造函数
Foo
其原型属性prototype
指向其原型对象Foo.prototype
。原型对象Foo.prototype
的默认属性constructor
指向原函数Foo
。
image.pngconsole.log(Foo.prototype)
构造函数Foo
的实例f1,f2
,其__proto__
属性指向其构造函数的原型对象Foo.prototype
,所以实例能共享原型对象上的属性和方法。
console.log(f1.__proto__, 'f1.__proto__');
console.log(Foo.prototype, 'Foo.prototype');
console.log(f1.__proto__ === Foo.prototype); // true
image.png
构造函数Foo
是Funciton
函数创建的实例,所以其__proto__
属性指向的是Function
函数的原型对象Function.prototype
。
console.log(Foo.__proto__, 'Foo.__proto__');
console.log(Function.prototype, 'Function.prototype');
console.log(Foo.__proto__ === Function.prototype); // true
image.png
构造函数Foo
的原型对象Foo.prototype
(本质上是一个对象),是Object
创建的一个实例,因此其__proto__
属性指向Object
的原型对象Object.prototype
。
console.log(Foo.prototype.__proto__, 'Foo.prototype.__proto__');
console.log(Object.prototype,'Object.prototype');
console.log(Foo.prototype.__proto__ === Object.prototype) // true
image.png
-
Function
函数所有的函数其实都是
Function
函数的实例,所以所有的函数的__protot__
属性都指向Function.prototype
。因为
Function
函数实例化了它本身,所以Function.__protot__
就等于Function.prototype
。
image.pngconsole.log(Function.__proto__, 'Function.__proto__'); console.log(Function.prototype, 'Function.prototype'); console.log(Function.__proto__ === Function.prototype) // true
Function
函数的原型对象是Object
函数创建的实例,因此Function.prototype.__proto__
,指向的是Object
的原型对象Object.prototype
image.pngconsole.log(Function.prototype.__proto__, 'Function.prototype.__proto__'); console.log(Object.prototype, 'Object.prototype'); console.log(Function.prototype.__proto__ === Object.prototype) // true
-
Object
函数Object
函数实际上是Function
函数创建的实例,其__proto__
属性指向的就是Function
函数的原型对象Function.prototype
。需要注意的是
Object.prototype
的__proto__
终止于null
console.log(Object.prototype.__proto__, 'Object.prototype.__proto__');
![image.png](https://img.haomeiwen.com/i10868925/c1c82c57d52764bf.image?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果上述有什么不对的地方,可以在下方留言评论告知哦!
纯手打,请各位大佬给我点个赞!感谢!
image.png