The following features of ES5 cannot be shimmed.
Using Object.defineProperty
if you define a non-enumerable property on an object then for..in
loops over that object will behave correctly in modern browsers but enumerate over that property in legacy browsers.
This means that code that works in modern browsers, breaks in legacy browsers.