@samitouri / QOS-React-2 / commits / 83644185f4

isReactClass -> .prototype.isReactComponent

Put the flag on the prototype instead to help certain limited forms of class extensions that doesn't properly transfer static properties. Fixes #4836

Sebastian Markbage committed Sep 30, 2015 at 18:28 UTC 83644185f4388834c0c482c7522a5f2f476d84a2
5 files changed +33 -4
src/isomorphic/classic/class/ReactClass.js
-1
@@ -847,7 +847,6 @@ var ReactClass = {
847 };
848 Constructor.prototype = new ReactClassComponent();
849 Constructor.prototype.constructor = Constructor;
850 - Constructor.isReactClass = {};
850
851 injectedMixins.forEach(
852 mixSpecIntoComponent.bind(null, Constructor)
src/isomorphic/modern/class/ReactComponent.js
+1 -1
@@ -29,7 +29,7 @@ function ReactComponent(props, context, updater) {
29 this.updater = updater || ReactNoopUpdateQueue;
30 }
31
32 -ReactComponent.isReactClass = {};
32 +ReactComponent.prototype.isReactComponent = {};
33
34 /**
35 * Sets a subset of the state. Always use this to mutate
src/renderers/dom/client/ReactMount.js
+1 -1
@@ -412,7 +412,7 @@ function findFirstReactDOMImpl(node) {
412 * here.
413 */
414 var TopLevelWrapper = function() {};
415 -TopLevelWrapper.isReactClass = {};
415 +TopLevelWrapper.prototype.isReactComponent = {};
416 if (__DEV__) {
417 TopLevelWrapper.displayName = 'TopLevelWrapper';
418 }
src/renderers/shared/reconciler/ReactCompositeComponent.js
+1 -1
@@ -176,7 +176,7 @@ var ReactCompositeComponentMixin = {
176 // We support ES6 inheriting from React.Component, the module pattern,
177 // and stateless components, but not ES6 classes that don't extend
178 warning(
179 - Component.isReactClass ||
179 + (Component.prototype && Component.prototype.isReactComponent) ||
180 !canInstantiate ||
181 !(inst instanceof Component),
182 '%s(...): React component classes must extend React.Component.',
src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js
+30
@@ -1211,5 +1211,35 @@ describe('ReactCompositeComponent', function() {
1211 expect(console.error.calls.length).toBe(0);
1212 });
1213
1214 + it('should warn when a class does not extend React.Component', function() {
1215 +
1216 + var container = document.createElement('div');
1217 +
1218 + class Foo {
1219 + render() {
1220 + return <span />;
1221 + }
1222 + }
1223 +
1224 + function Bar() { }
1225 + Bar.prototype = Object.create(React.Component.prototype);
1226 + Bar.prototype.render = function() {
1227 + return <span />;
1228 + };
1229 +
1230 + expect(console.error.calls.length).toBe(0);
1231 +
1232 + ReactDOM.render(<Bar />, container);
1233 +
1234 + expect(console.error.calls.length).toBe(0);
1235 +
1236 + ReactDOM.render(<Foo />, container);
1237 +
1238 + expect(console.error.calls.length).toBe(1);
1239 + expect(console.error.argsForCall[0][0]).toContain(
1240 + 'React component classes must extend React.Component'
1241 + );
1242 +
1243 + });
1244
1245 });