| var anObject = require('../internals/an-object'); |
| var defineProperties = require('../internals/object-define-properties'); |
| var enumBugKeys = require('../internals/enum-bug-keys'); |
| var hiddenKeys = require('../internals/hidden-keys'); |
| var html = require('../internals/html'); |
| var documentCreateElement = require('../internals/document-create-element'); |
| var sharedKey = require('../internals/shared-key'); |
| |
| var GT = '>'; |
| var LT = '<'; |
| var PROTOTYPE = 'prototype'; |
| var SCRIPT = 'script'; |
| var IE_PROTO = sharedKey('IE_PROTO'); |
| |
| var EmptyConstructor = function () { /* empty */ }; |
| |
| var scriptTag = function (content) { |
| return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; |
| }; |
| |
| // Create object with fake `null` prototype: use ActiveX Object with cleared prototype |
| var NullProtoObjectViaActiveX = function (activeXDocument) { |
| activeXDocument.write(scriptTag('')); |
| activeXDocument.close(); |
| var temp = activeXDocument.parentWindow.Object; |
| activeXDocument = null; // avoid memory leak |
| return temp; |
| }; |
| |
| // Create object with fake `null` prototype: use iframe Object with cleared prototype |
| var NullProtoObjectViaIFrame = function () { |
| // Thrash, waste and sodomy: IE GC bug |
| var iframe = documentCreateElement('iframe'); |
| var JS = 'java' + SCRIPT + ':'; |
| var iframeDocument; |
| iframe.style.display = 'none'; |
| html.appendChild(iframe); |
| // https://github.com/zloirock/core-js/issues/475 |
| iframe.src = String(JS); |
| iframeDocument = iframe.contentWindow.document; |
| iframeDocument.open(); |
| iframeDocument.write(scriptTag('document.F=Object')); |
| iframeDocument.close(); |
| return iframeDocument.F; |
| }; |
| |
| // Check for document.domain and active x support |
| // No need to use active x approach when document.domain is not set |
| // see https://github.com/es-shims/es5-shim/issues/150 |
| // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 |
| // avoid IE GC bug |
| var activeXDocument; |
| var NullProtoObject = function () { |
| try { |
| /* global ActiveXObject */ |
| activeXDocument = document.domain && new ActiveXObject('htmlfile'); |
| } catch (error) { /* ignore */ } |
| NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); |
| var length = enumBugKeys.length; |
| while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; |
| return NullProtoObject(); |
| }; |
| |
| hiddenKeys[IE_PROTO] = true; |
| |
| // `Object.create` method |
| // https://tc39.github.io/ecma262/#sec-object.create |
| module.exports = Object.create || function create(O, Properties) { |
| var result; |
| if (O !== null) { |
| EmptyConstructor[PROTOTYPE] = anObject(O); |
| result = new EmptyConstructor(); |
| EmptyConstructor[PROTOTYPE] = null; |
| // add "__proto__" for Object.getPrototypeOf polyfill |
| result[IE_PROTO] = O; |
| } else result = NullProtoObject(); |
| return Properties === undefined ? result : defineProperties(result, Properties); |
| }; |