js关于原型(__proto__)和原型(prototype)与拓展学习

99 阅读1分钟

原型(_proto_)和原型(prototype)与拓展

前言:

没有直接接触原型protoprototype、甚至是constructor可以看看下面这张图.

我们打印实例化对象:

image.png

我们打印函数(构造)(以对象的结构输出):

image.png

这里是String实例化对象和String构造函数。
我们注意到其中的__proto__、prototype两个属性,而且没有直接包含constructor属性。

ps:有可能__proto__被[[prototype]]代替,他们是一个属性,只是显示不一样,后面都用__proto__。

回到主题:原型讲解

我们先提出总结:

  • 函数的原型是prototype
  • 对象的原型是__proto__
  • js中函数可以看作对象,所以作为对象时原型是__proto__
    所以:函数一定包含__proto__和prototype,而对象有且只有__proto__。
  • 原型之中包含constructor,该属性指向以此为原型的函数。
  • 函数构造的对象的原型就是函数a的原型 所以总结:
    函数.prototype===对象._proto_
    对象._proto_.constructor===函数.prototype.constructor===函数

特殊情况:构造函数作为对象时__proto__.constructor应该指向一个函数,是谁? 系统统一设置为Function构造函数————“构造的构造”,而Function构造函数的构造就是他自己。
所以:
函数(对象).proto.constructor===Function函数
函数(对象).proto===Function函数.prototype
函数(对象).proto.constructor===Function函数(对象).proto.constructor===Function函数

总结完毕:开始一步一步讲解:

未完待续...