对于JS中原型与原型链的理解

首先明确,JS中所有的引用类型都是对象,即函数也是对象。
那么,引用类型和基本类型有什么区别呢?
基本类型存储出在栈内存中的,栈内存中的内容都是已知大小或是有范围上限的,而引用类型同时存储于栈内存与堆内存中,栈内存中存储变量标识符和指向堆内存中该对象的指针。堆内存中的内容大多是大小未知的。
栈内存中内容不可变,堆内存中内容可变。

对于JS中原型与原型链的理解_第1张图片
上述明确后,便可以将对象分为两类函数对象、普通对象。
所有对象都是由构造函数创建的。所有函数都有一个prototype属性,指向该函数的原型对象,这个原型对象是在创建函数时系统在后台自动new Object()的对象。
这个对象有一个constructor属性,指向与之对应的函数。
对于JS中原型与原型链的理解_第2张图片
所有对象都有一个__proto__属性,该属性指向它的原型对象。

对于JS中原型与原型链的理解_第3张图片
Fn本身作为函数兑现也有__proto__,其指向作为Fn的构造函数Function的原型对象
Function.prototype

Function.prototype作为对象还可以继续向上查找原型对象,已知所有的构造函数对应的原型对象都是系统后台new Object()的。
所以Function.prototype的构造函数是object,Function.prototype.__proto__指向Object.prototype。
由于Object是最顶层的对象,所有Object.prototype.__proto__指向null。

总而言之

  • 一切引用类型皆对象;
  • 对象有构造函数创建,构造函数声明时系统后台自动为它new Object()一个原型对象;
  • 构造函数通过prototype属性指向该原型对象,原型对象通过constructor指向该函数;
  • 所有函数都有prototype;
  • 所有兑现都有__proto__,指向它的构造函数的原型对象,并从该原型对象中继承方法和属性;
  • 函数是对象,对象不一定是函数;

你可能感兴趣的:(对于JS中原型与原型链的理解)