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

上述明确后,便可以将对象分为两类函数对象、普通对象。
所有对象都是由构造函数创建的。所有函数都有一个prototype属性,指向该函数的原型对象,这个原型对象是在创建函数时系统在后台自动new Object()的对象。
这个对象有一个constructor属性,指向与之对应的函数。

所有对象都有一个__proto__属性,该属性指向它的原型对象。

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__,指向它的构造函数的原型对象,并从该原型对象中继承方法和属性;
- 函数是对象,对象不一定是函数;
本文深入探讨了JavaScript中对象的实现机制,包括基本类型与引用类型的存储方式,对象的构造函数,函数对象与普通对象的区别,以及原型链的工作原理。详细解释了构造函数、原型对象、__proto__属性之间的关系。
1132

被折叠的 条评论
为什么被折叠?



