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.
83 lines
3.0 KiB
83 lines
3.0 KiB
/* 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; |
|
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 { |
|
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-x/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); |
|
};
|
|
|