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.
49 lines
1.7 KiB
49 lines
1.7 KiB
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;
|
|
|