react源码解析/基础-Component-PureComponent
Component&PureComponent
Component
与PureComponent
是我们工作中经常使用的两个API, 它们的源码ReactBaseClasses.js
文件中, 根据文件最后一行可以知道, 这个文件只导出了Component
和PureComponent
.
Component
首先, 我们来看Component
:
1 | function Component(props, context, updater) { |
由此可以看出, Component
其实就是定义的一个构造函数, 实例属性有props
, context
, refs
和updater
, 原型上挂载了isReactComponent
对象, setState()
方法和forceUpdate()
方法.
PureComponent
1 | function PureComponent(props, context, updater) { |
PureComponent
的定义就更简单了, 只定义了实例属性, 它的原型属性是通过继承Component
来实现.
继承
1 | function ComponentDummy() {} |
那么这个继承是怎么实现的呢, 我们先来看js实现继承的几种方案:
原型式继承
1 | function object(obj) { |
通过一个函数的原型以另一个对象为基础来生成两个相似的对象, 从而继承传入的obj.
寄生式继承
1 | function inheritPrototype(child, parent) { |
寄生式继承可以理解为原型式继承的加强版, 通过object
生成新的原型之后, 再对这个原型进行加强.
到这里基本就理解PureComponen
实现继承的原理了, 其实就是通过寄生式继承来实现, ComponentDummy
就是扮演了原型式继承中函数F
的作用. 最后Object.assign(pureComponentPrototype, Component.prototype);
官方说法是为了避免原型跳跃, 我想这种做法的好处是把原型的属性尽可能提前, 暴露在最外层原型上, 节省原型查找的时间.
不得不说, React
的工程师还是很牛逼的!