https://github.com/KieSun/Dream/issues/2
https://blog.csdn.net/cc18868876837/article/details/81211729

普通对象和函数对象

JavaScript中万物皆对象,但对象之间也是有区别的。分为函数对象和普通对象。

函数(构造函数)可以创建对象(实例),对象没法创建函数。
凡是通过new Function创建的对象都是函数对象,其他都是普通对象(通常通过Object创建),可以通过typeof来判断。

牢记几点:
__proto__constructor属性是对象所独有的
prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__constructor属性。

🌰

  1. function Foo() {...};
  2. let f1 = new Foo();

proto & 原型链

首先我们要知道它是对象所独有的(但是都是对象,所以都有这个属性),proto指向的是他的原型对象(可以理解为指向父亲)

作用:
proto属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的proto属性所指向的那个对象(父对象)里找,一直找,直到proto属性的终点null,再往上找就相当于在null上取值,会报错。通过proto属性将对象连接起来的这条链路即我们所谓的原型链!!

我们平时调用的字符串方法、数组方法、对象方法、函数方法等都是靠__proto__继承而来的。
image.png

prototype 属性

一个构造函数对应了一个原型对象

image.png
首先它是函数对象才独有的属性,指向的函数的原型对象**,**也就是这个函数(其实所有函数都可以作为构造函数)所创建的实例的原型对象,由此可知:f1.__proto__ === Foo.prototype

作用:
它的作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法(解决了new出来的实例同样的方法指向不同的地址,浪费内存) 。任何函数在创建的时候,其实会默认同时创建该函数的prototype对象。

constructor属性

image.png

constructor属性也是对象才拥有的,它是从一个对象指向一个函数,含义就是指向该对象的构造函数,每个对象都有构造函数(本身拥有或继承而来,继承而来的要结合__proto__属性查看会更清楚点,如下图所示),所有函数和对象最终都是由Function构造函数得来,所以constructor属性的终点就是Function这个函数

image.png

总结:

  • __proto__constructor属性是对象所独有的,prototype 是函数对象独有
  • proto 实例为了实现属性的继承
  • prototype属性的作用就是让该函数的实例都可以找到公用的属性和方法
  • constructor属性的含义就是指向该对象的构造函数