针对文章https://overreacted.io/how-does-react-tell-a-class-from-a-function/的摘录
为什么要区分
从两种形式的Component中获取node节点的方式不一样,Function的直接调用,Class的需要实例化,再调用实例的render方法。
没法针对Function和Class都调用new
操作符 + arrow function
调用new会报错 + Function的返回值可能不是对象,调用new得到的不会是预期的对象 + Function里面的this不是实例对象,使得最终调用new之后的结果不是预期的
没法针对Function和Class都直接调用 + 一些babel的处理中,针对构造函数的直接调用会报错 + 未被babel转译过的ES6形式的Class,直接调用会报错
如何区分
instanceof 运算符
关于prototype
和__proto__
的区别
__proto__ 是指向一个对象的原型 prototype是Function和Class才具有的,是指向的经由Function和Class实例化出来的实例的 __proto__
为什么不能使用 instanceof来区分
因为早起的一些实践,导致同一个页面可能同时出现多个React, 这个时候instanceof可能就会出错
static属性
一些Class的实现中,并不会拷贝Class的static属性给实例
prototype属性
class Component{}
Component.prototype.isReactComponent = {}
class Greeting extends Component {}
console.log(Greeting.prototype.isReactComponent); // yes
至于为什么isReactComponent需要是一个对象而不是一个简单的基本类型,这是因为需要兼容早期的Jest
原创内容,欢迎转载 😊