50 lines
1.7 KiB
JavaScript
50 lines
1.7 KiB
JavaScript
|
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 IE_PROTO = sharedKey('IE_PROTO');
|
||
|
|
||
|
var PROTOTYPE = 'prototype';
|
||
|
var Empty = function () { /* empty */ };
|
||
|
|
||
|
// Create object with fake `null` prototype: use iframe Object with cleared prototype
|
||
|
var createDict = function () {
|
||
|
// Thrash, waste and sodomy: IE GC bug
|
||
|
var iframe = documentCreateElement('iframe');
|
||
|
var length = enumBugKeys.length;
|
||
|
var lt = '<';
|
||
|
var script = 'script';
|
||
|
var gt = '>';
|
||
|
var js = 'java' + script + ':';
|
||
|
var iframeDocument;
|
||
|
iframe.style.display = 'none';
|
||
|
html.appendChild(iframe);
|
||
|
iframe.src = String(js);
|
||
|
iframeDocument = iframe.contentWindow.document;
|
||
|
iframeDocument.open();
|
||
|
iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);
|
||
|
iframeDocument.close();
|
||
|
createDict = iframeDocument.F;
|
||
|
while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];
|
||
|
return createDict();
|
||
|
};
|
||
|
|
||
|
// `Object.create` method
|
||
|
// https://tc39.github.io/ecma262/#sec-object.create
|
||
|
module.exports = Object.create || function create(O, Properties) {
|
||
|
var result;
|
||
|
if (O !== null) {
|
||
|
Empty[PROTOTYPE] = anObject(O);
|
||
|
result = new Empty();
|
||
|
Empty[PROTOTYPE] = null;
|
||
|
// add "__proto__" for Object.getPrototypeOf polyfill
|
||
|
result[IE_PROTO] = O;
|
||
|
} else result = createDict();
|
||
|
return Properties === undefined ? result : defineProperties(result, Properties);
|
||
|
};
|
||
|
|
||
|
hiddenKeys[IE_PROTO] = true;
|