UNPKG

1.78 kBJavaScriptView Raw
1var anObject = require('../internals/an-object');
2var defineProperties = require('../internals/object-define-properties');
3var enumBugKeys = require('../internals/enum-bug-keys');
4var hiddenKeys = require('../internals/hidden-keys');
5var html = require('../internals/html');
6var documentCreateElement = require('../internals/document-create-element');
7var sharedKey = require('../internals/shared-key');
8var IE_PROTO = sharedKey('IE_PROTO');
9
10var PROTOTYPE = 'prototype';
11var Empty = function () { /* empty */ };
12
13// Create object with fake `null` prototype: use iframe Object with cleared prototype
14var createDict = function () {
15 // Thrash, waste and sodomy: IE GC bug
16 var iframe = documentCreateElement('iframe');
17 var length = enumBugKeys.length;
18 var lt = '<';
19 var script = 'script';
20 var gt = '>';
21 var js = 'java' + script + ':';
22 var iframeDocument;
23 iframe.style.display = 'none';
24 html.appendChild(iframe);
25 iframe.src = String(js);
26 iframeDocument = iframe.contentWindow.document;
27 iframeDocument.open();
28 iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);
29 iframeDocument.close();
30 createDict = iframeDocument.F;
31 while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];
32 return createDict();
33};
34
35// `Object.create` method
36// https://tc39.github.io/ecma262/#sec-object.create
37module.exports = Object.create || function create(O, Properties) {
38 var result;
39 if (O !== null) {
40 Empty[PROTOTYPE] = anObject(O);
41 result = new Empty();
42 Empty[PROTOTYPE] = null;
43 // add "__proto__" for Object.getPrototypeOf polyfill
44 result[IE_PROTO] = O;
45 } else result = createDict();
46 return Properties === undefined ? result : defineProperties(result, Properties);
47};
48
49hiddenKeys[IE_PROTO] = true;