You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					79 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					79 lines
				
				2.8 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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);
							 | 
						||
| 
								 | 
							
								};
							 |