【问题标题】:How is return value of getBoundingClientRect Immutable?getBoundingClientRect 不可变的返回值如何?
【发布时间】:2014-11-29 08:15:11
【问题描述】:

这里有一些有趣的东西:在任何 JS 窗口中运行:

val = document.body.getBoundingClientRect();
console.log(val)
val.left += 10;
console.log(val)

或对返回值的任何其他修改。这个对象怎么是不可变的?

这使得很难对元素的 getBoundingClientRect() 进行回避,从而更改原始值。尽管我认为您可以重新创建对象,但我不知道 JS 甚至具有不可变对象的能力。这是正确的吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    只是一个简单的例子:

    var getBoundingNothing = {left:20};
    Object.freeze( getBoundingNothing );        // if you comment this line...
    
    var gbn = getBoundingNothing;
    console.log( gbn ); //  Object { left=20 }
    gbn.left = 70 ;
    console.log( gbn ); //  Object { left=20 }  // ...than left=70
    

    考虑阅读这篇有趣的文章:http://ejohn.org/blog/ecmascript-5-objects-and-properties/

    从那篇文章中,您所需要的一切,请直接访问 MDN:
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

    【讨论】:

    • 我认为没有办法填充这个是正确的吗?
    • @ChrisHayes 看到这个:javascript.crockford.com/private.html 似乎是一种显而易见的方式。如果缺少 Object.freeze - 您可以创建闭包原型并返回不可变值。
    • 这是获得不变性的一种简单方法,但实际上并不是一回事。毕竟,我不能将其应用于任意对象,而且设置原型的开销远高于仅调用Object.freezeThis question 提出了一种方法,但它似乎与旧版浏览器不完全兼容。我想在所有浏览器中都可以使用它是一个白日梦。
    • @ChrisHayes 我不认为这是一个很好的例子,因为它使用了 ECMAScript 5 中引入的相同方法,这导致了我们亲爱的 .freeze
    • 是的,这肯定是个问题。我想如果您正在使用选择实现所有 except freeze 的奇怪浏览器,它会很有用。 :)
    猜你喜欢
    • 2022-01-08
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2022-01-15
    • 1970-01-01
    • 2018-10-19
    • 2015-05-12
    相关资源
    最近更新 更多