【问题标题】:getBoundingClientRect() Object properties cannot be copied [duplicate]getBoundingClientRect() 对象属性无法复制[重复]
【发布时间】:2017-03-10 08:02:10
【问题描述】:
function test(o) {
    console.log("Object:", o);
    console.log("Assign test:", Object.assign({}, o));
    console.log("Keys test:", Object.keys(o));
    console.log("JSON test:", JSON.stringify(o));
}

var el = document.getElementById("question");                 /* or document.body */

test(el.style);                                               /* works as expected */
test(el.getBoundingClientRect());                             /* behaves like {} */
test(Object.assign(el.getBoundingClientRect(),{aaaa: 1111})); /* works... only for aaaa */

为什么?

输出(测试结果)

PasteBin

MDN 文档

  1. Element.getBoundingClientRect()
  2. DOMRect

【问题讨论】:

  • 你能在这里添加输出吗?
  • @MertAkcakaya:我正在尝试添加输出,但 StackOverflow 阻止它并显示消息“看起来您的帖子主要是代码;请添加更多细节。” ☹ 所以我把它贴在了 PasteBin 上。

标签: javascript getboundingclientrect


【解决方案1】:

Object.assignObject.keys 正在使用 自己的 可枚举属性。 DOMRect 属性继承自 DOMRectPrototype 并且无法通过这些方法访问。

您可以通过以下方式证明:

let rect = el.getBoundingClientRect();
rect.hasOwnProperty('x');                        // === false
Object.getPrototypeOf(rect).hasOwnProperty('x'); // === true

我使用 Lodash _.assignIn 迭代自己的和继承的源属性:

https://jsfiddle.net/msazmfxo/

更新

基于这个答案,7vujy0f0hy found 可接受的solution

var ownify = input => 
               Object.keys(Object.getPrototypeOf(input)).reduce((output,key) => 
                 Object.assign(output, {[key]: input[key]}), Object.assign({}, input));

test(ownify(el.getBoundingClientRect())); /* apparently works! */

(虽然它只迭代了一层继承,但仍然会丢失更深层次的属性)

【讨论】:

  • 非常好的功能,这个_.assignIn!我希望它是原生的。我用o.width 替换了你小提琴中的o.x,这是CSSStyleDeclarationDOMRect 中巧合存在的属性。此外,与 MDN 不同,我的 Chrome (Windows) 中的DOMRect 缺少属性xy。这是您的 Fiddle 的 my fork,以及其他一些对教育价值的改进。附言正确的拼写是“证明”(动词),而不是“证明”(名词)。
  • Even better Fiddle。我将function test() 还原为原始形式,而是在主代码中添加了第四个调用:test(_.assignIn({}, el.getBoundingClientRect())); /* just works! */
  • 根据您的帖子,我创建了一个函数ownify(),它接受一个对象input 并返回一个新对象output,它拥有旧对象的所有继承属性对象input。见new Fiddle。我希望一个被接受的解决方案包含这个功能(如果它没有缺陷)。我们可以将其添加到您的答案中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2019-10-29
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多