From 7ce8c844bda7d2fe204ad59c10092ffde3f53938 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Thu, 23 Oct 2014 10:53:57 -0700 Subject: [PATCH] Hide ReactElement constructor This prevents feature tests like: var ReactElement = React.createElement(...).constructor; if (element.constructor === ReactElement) This is intentional so that we have the option to make these plain objects. E.g. for direct inlining or replacing them with value types. --- src/core/ReactElement.js | 8 ++++++-- src/core/__tests__/ReactElement-test.js | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/ReactElement.js b/src/core/ReactElement.js index 5d529c573c..dd7c86ba31 100644 --- a/src/core/ReactElement.js +++ b/src/core/ReactElement.js @@ -120,12 +120,16 @@ var ReactElement = function(type, key, ref, owner, context, props) { this.props = props; }; +// We intentionally don't expose the function on the constructor property. +// ReactElement should be indistinguishable from a plain object. +ReactElement.prototype = { + _isReactElement: true +}; + if (__DEV__) { defineMutationMembrane(ReactElement.prototype); } -ReactElement.prototype._isReactElement = true; - ReactElement.createElement = function(type, config, children) { var propName; diff --git a/src/core/__tests__/ReactElement-test.js b/src/core/__tests__/ReactElement-test.js index ebce1faea6..74bfa726af 100644 --- a/src/core/__tests__/ReactElement-test.js +++ b/src/core/__tests__/ReactElement-test.js @@ -402,4 +402,10 @@ describe('ReactElement', function() { expect(instance.getDOMNode().tagName).toBe('DIV'); }); + it('is indistinguishable from a plain object', function() { + var element = React.createElement('div', { className: 'foo' }); + var object = {}; + expect(element.constructor).toBe(object.constructor); + }); + });