lukeed / klona

A tiny (240B to 501B) and fast utility to "deep clone" Objects, Arrays, Dates, RegExps, and more!
MIT License
1.62k stars 43 forks source link

Can't clone objects created within iframes. #30

Open juliofarah opened 3 years ago

juliofarah commented 3 years ago

While testing a tool that uses klona/lite, I realized the library did not clone objects created within iframes.

There's a bigger discussion here about how prototypes are different for similar objects when created in different iframes (or within an iframe versus the top page).

When I create an object within an iframe: image

this snippet https://github.com/lukeed/klona/blob/master/src/lite.js#L7-L13 is executed, given typeof x.constructor === 'function' and not object when the object is created within an iframe.

Line 10 though checks if the property already exists on the temporary object, which is empty, ignoring the property I'm trying to clone.

I got around the problem by switching from klona/lite to klona/full as the latter doesn't include that constructor check, but I'd love to switch back to shave those extra few bites off of my final bundle

bodograumann commented 3 years ago

Shouldn’t https://github.com/lukeed/klona/blob/master/src/index.js#L10 and https://github.com/lukeed/klona/blob/master/src/lite.js#L10 always check whether x.hasOwnProperty(k) instead of tmp.hasOwnProperty(k)? Currently cloning class objects always gives empty objects iinm!

tripodsgames commented 3 years ago

Shouldn’t https://github.com/lukeed/klona/blob/master/src/index.js#L10 and https://github.com/lukeed/klona/blob/master/src/lite.js#L10 always check whether x.hasOwnProperty(k) instead of tmp.hasOwnProperty(k)? Currently cloning class objects always gives empty objects iinm!

Having this issue here too. Im using klona/full as a temporary fix. @lukeed hasOwnProperty is really necessary?

lukeed commented 3 years ago

I believe this is now solved by #31 (thanks @tripodsgames) which includes @bodograumann's suggestion. If someone can verify that this is solved in the latest release (soon to be 2.0.5) that'd be much appreciated 🙇