Właśnie usłyszałem o metodach JavaScript freeze
i seal
, które można wykorzystać do uczynienia dowolnego obiektu niezmiennym.
Oto krótki przykład, jak go używać:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
Jaka jest różnica między freeze
i seal
? Czy mogą zwiększyć wydajność?
javascript
ecmascript-5
maja
źródło
źródło
Object.preventExtensions
opróczObject.seal
iObject.freeze
.Object.preventExtensions
po prostu zapobiega dodawaniu nowych elementów do obiektu. Możesz usuwać, konfigurować i zmieniać wartości właściwości obiektów, dla których wyłączono ich rozszerzalność za pomocąObject.preventExtensions
.Odpowiedzi:
Object.seal
delete
zwróci fałszwritable
atrybut, oraz ichvalue
atrybut, jeśliwriteable
jest prawdziwy).TypeError
podczas próby zmodyfikowania wartości samego zapieczętowanego obiektu (najczęściej w trybie ścisłym )Object.freeze
Object.seal
, co robi, a ponadto:Żaden z nich nie wpływa na obiekty „głębokie” / wnuki. Np. Jeśli
obj
jest zamrożone,obj.el
nie można go ponownie przypisać, ale wartośćobj.el
można zmodyfikować, np.obj.el.id
Można ją zmienić.Występ:
Zapieczętowanie lub zamrożenie obiektu może wpłynąć na szybkość jego wyliczania w zależności od przeglądarki:
Testy: Sealed obiekty , zamrożone obiekty .
źródło
seal
sprawia , że istniejące właściwości nie są konfigurowalne, patrz jsfiddle.net/btipling/6m743whn Numer 2, nadal można edytować, to znaczy zmieniać wartości istniejących właściwości w zamkniętym obiekcie.onClick
lubonlick
i zastanawiali się, dlaczego nie działa. Jeśli JavaScript zgłasza błąd, to o jedną rzecz mniej do popełnienia błędu. Po drugie, pozwala to na zaimplementowanie stałych właściwości obiektu, co zapobiega zmianom. Jest to szczególnie przydatne w przypadku metod obiektowych.Napisałem projekt testowy, który porównuje te 3 metody:
Object.freeze()
Object.seal()
Object.preventExtensions()
Moje testy jednostkowe obejmują przypadki CRUD:
Wynik:
źródło
DEBUGMODE
zmienną i ustaw ją natrue
. Następnie zróbif (DEBUGMODE) { ... }
. W programie...
umieść swoją funkcjonalność zapewniającą, że wszystkie obiekty DOM są zawsze zapieczętowane. Następnie, gdy jesteś gotowy do dystrybucji skryptu strony internetowej, zmieńDEBUGMODE
gofalse
, uruchom skrypt za pomocą kompilatora zamknięcia i rozpowszechnij go. To takie proste.element.onlick=something
i są sfrustrowani, ponieważ to nie działa, ale technicznie nie jest to błąd.Zawsze możesz je sprawdzić w MDN. W skrócie:
źródło
Object.seal()
również wydaje się zamrażać właściwości prototypu: \Object.freeze()
tworzy zamrożony obiekt, co oznacza, że pobiera istniejący obiekt i zasadniczo go wywołujeObject.seal()
, ale także oznacza wszystkie właściwości „ elementu dostępu do danych” jakowritable:false
, aby nie można było zmienić ich wartości. - Kyle Simpson, You Don't Know JS - This & Object Prototypesźródło
Patrzyłem na różnice między Freeze i Seal w ECMAScript 5 i stworzyłem skrypt, aby wyjaśnić różnice. Frozen tworzy niezmienny obiekt, w tym dane i strukturę. Pieczęć zapobiega zmianom w nazwanych interfejsach - nie dodaje, nie usuwa - ale możesz zmutować obiekt i przedefiniować znaczenie jego interfejsu.
źródło
Wiem, że mogę się trochę spóźnić, ale
false
. gdzie jak w Sealed writable atrybut jest ustawiony na,true
a pozostałe atrybuty są false.źródło
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable
===true
.Możesz teraz wymusić zamrożenie pojedynczej właściwości obiektu zamiast zamrażania całego obiektu. Można to osiągnąć z
Object.defineProperty
zewritable: false
jako parametr.W tym przykładzie
obj.first
jego wartość jest teraz zablokowana na 99.źródło
Stworzyłem prostą tabelę, aby porównać poniższe funkcje i wyjaśnić różnicę między tymi funkcjami.
źródło