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.
86 lines
3.1 KiB
86 lines
3.1 KiB
4 weeks ago
|
'use strict';
|
||
|
/* global ActiveXObject -- old IE, WSH */
|
||
|
var anObject = require('../internals/an-object');
|
||
|
var definePropertiesModule = 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;
|
||
|
// eslint-disable-next-line no-useless-assignment -- avoid memory leak
|
||
|
activeXDocument = null;
|
||
|
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 {
|
||
|
activeXDocument = new ActiveXObject('htmlfile');
|
||
|
} catch (error) { /* ignore */ }
|
||
|
NullProtoObject = typeof document != 'undefined'
|
||
|
? document.domain && activeXDocument
|
||
|
? NullProtoObjectViaActiveX(activeXDocument) // old IE
|
||
|
: NullProtoObjectViaIFrame()
|
||
|
: NullProtoObjectViaActiveX(activeXDocument); // WSH
|
||
|
var length = enumBugKeys.length;
|
||
|
while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
|
||
|
return NullProtoObject();
|
||
|
};
|
||
|
|
||
|
hiddenKeys[IE_PROTO] = true;
|
||
|
|
||
|
// `Object.create` method
|
||
|
// https://tc39.es/ecma262/#sec-object.create
|
||
|
// eslint-disable-next-line es/no-object-create -- safe
|
||
|
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 : definePropertiesModule.f(result, Properties);
|
||
|
};
|