2014-11-29 3 views
2

Вот кое-что интересное: В любом окне запуска JS:Как возвращается значение getBoundingClientRect неизменяемо?

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

или любой другой модификации возвращаемого значения. Как этот объект является неизменным?

Это затрудняет утилизацию элемента getBoundingClientRect() для элемента, изменяя исходные значения. Хотя я предполагаю, что вы могли бы воссоздать объект, я не знал, что JS даже имеет возможность неизменных объектов. Это верно?

ответ

2

Просто простой пример:

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

+0

Я правильно в мышлении нет возможности полиполнять это? –

+0

@ChrisHayes видит это: http://javascript.crockford.com/private.html Кажется очевидным. Если Object.freeze отсутствует, вы можете прототип его создания закрытия и возврата неизменяемых значений. –

+0

Это простой способ получить неизменность, но на самом деле это не то же самое. В конце концов, я не могу применить это к произвольным объектам, и накладные расходы на создание прототипа намного выше, чем просто вызов 'Object.freeze'. [Этот вопрос] (http://stackoverflow.com/questions/13117771/javascript-object-doesnt-support-method-freeze) предлагает метод, но он не кажется полностью совместимым со старыми браузерами. Я полагаю, что это мечта мечты, чтобы она была доступна во всех браузерах. –

Смежные вопросы