diff --git a/src/isomorphic/classic/class/ReactClass.js b/src/isomorphic/classic/class/ReactClass.js index b4248c62f7..b335a07344 100644 --- a/src/isomorphic/classic/class/ReactClass.js +++ b/src/isomorphic/classic/class/ReactClass.js @@ -847,7 +847,6 @@ var ReactClass = { }; Constructor.prototype = new ReactClassComponent(); Constructor.prototype.constructor = Constructor; - Constructor.isReactClass = {}; injectedMixins.forEach( mixSpecIntoComponent.bind(null, Constructor) diff --git a/src/isomorphic/modern/class/ReactComponent.js b/src/isomorphic/modern/class/ReactComponent.js index 3390ff161b..f99cb0385c 100644 --- a/src/isomorphic/modern/class/ReactComponent.js +++ b/src/isomorphic/modern/class/ReactComponent.js @@ -29,7 +29,7 @@ function ReactComponent(props, context, updater) { this.updater = updater || ReactNoopUpdateQueue; } -ReactComponent.isReactClass = {}; +ReactComponent.prototype.isReactComponent = {}; /** * Sets a subset of the state. Always use this to mutate diff --git a/src/renderers/dom/client/ReactMount.js b/src/renderers/dom/client/ReactMount.js index f536bbb6de..67ff78d0da 100644 --- a/src/renderers/dom/client/ReactMount.js +++ b/src/renderers/dom/client/ReactMount.js @@ -412,7 +412,7 @@ function findFirstReactDOMImpl(node) { * here. */ var TopLevelWrapper = function() {}; -TopLevelWrapper.isReactClass = {}; +TopLevelWrapper.prototype.isReactComponent = {}; if (__DEV__) { TopLevelWrapper.displayName = 'TopLevelWrapper'; } diff --git a/src/renderers/shared/reconciler/ReactCompositeComponent.js b/src/renderers/shared/reconciler/ReactCompositeComponent.js index b96ece5133..09be6c0532 100644 --- a/src/renderers/shared/reconciler/ReactCompositeComponent.js +++ b/src/renderers/shared/reconciler/ReactCompositeComponent.js @@ -176,7 +176,7 @@ var ReactCompositeComponentMixin = { // We support ES6 inheriting from React.Component, the module pattern, // and stateless components, but not ES6 classes that don't extend warning( - Component.isReactClass || + (Component.prototype && Component.prototype.isReactComponent) || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', diff --git a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js index 929d3e70eb..5d46c433f1 100644 --- a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js +++ b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js @@ -1211,5 +1211,35 @@ describe('ReactCompositeComponent', function() { expect(console.error.calls.length).toBe(0); }); + it('should warn when a class does not extend React.Component', function() { + + var container = document.createElement('div'); + + class Foo { + render() { + return ; + } + } + + function Bar() { } + Bar.prototype = Object.create(React.Component.prototype); + Bar.prototype.render = function() { + return ; + }; + + expect(console.error.calls.length).toBe(0); + + ReactDOM.render(, container); + + expect(console.error.calls.length).toBe(0); + + ReactDOM.render(, container); + + expect(console.error.calls.length).toBe(1); + expect(console.error.argsForCall[0][0]).toContain( + 'React component classes must extend React.Component' + ); + + }); });