Javascript Observe

O ECMAScript 6 (codinome Harmony ou ES.next) já não é novidade para quem acompanha de perto os avanços do desenvolvimento web, e suas especificações já bem avançadas causam um certo alvoroço a respeito de como vais ser o futuro do Javascript. Uma das esperadas especificações é o Object.observe, que documenta a capacidade de observar e

O ECMAScript 6 (codinome Harmony ou ES.next) já não é novidade para quem acompanha de perto os avanços do desenvolvimento web, e suas especificações já bem avançadas causam um certo alvoroço a respeito de como vais ser o futuro do Javascript.

Uma das esperadas especificações é o Object.observe, que documenta a capacidade de observar e notificar aplicações sobre as mudanças ocorridas em objetos Javascript, recurso bastante requisitado em aplicações funcionais.

O uso de funcionalidades similares já é possível com algumas bibliotecas como o Watch.js e também por frameworks como o Backbone (além de outros), permitindo a criação de mecanismos declarativos e independentes das demais implementações da aplicação.

Para começar, precisamos entender o que esta funcionalidade é capaz de observar um objeto:

  • As mudanças no valor das propriedades;
  • A adição, exclusão e reconfiguração de todas as propriedades visíveis através das APIs de reflexão;
  • Mudanças no protótipo e extensibilidade do próprio objeto.

A API pública atual disponibiliza as seguintes métodos:

 Object.observe(Object, callback[, accepts])

Trata-se do método principal da API que é responsável pela funcionalidade de observar um objeto e sua assinatura é bastante simples, sendo necessário apenas informar o objeto a ser observado, a função a ser executada quando alguma notificação for disparada e opcionalmente um vetor de tipos de notificações a serem manipuladas (os tipos de notificações permitidas são: ”add”, “update”, “delete”, “reconfigure”, “setPrototype” e “preventExtensions”); Esta chamada pode ser executada quantas vezes for necessário (você pode querer executar callbacks distintos).

Sua utilização segue o seguinte exemplo:

A saída desta rotina, desconsiderando as propriedades herdadas pelo argumento regs, seria uma lista de objetos de notificações:

Object.unobserve(Object, callback)

Eventualmente, poderá ser necessário não acompanhar mais as notificações de um determinado objeto, ou apenas interromper a execução de um callback especifico; Para isso, basta executar conforme o exemplo, especificando o objeto observado e o callback a ser removido:

A saída desta rotina, também seria uma lista de objetos de notificações:

Array.observe(Object, callback)

É apenas um atalho, equivalente a:

Array.unobserve(Object, callback)

Outro atalho, equivalente a:

Object.deliverChangeRecords

Se notarmos o primeiro exemplo utilizado no método Object.observe, é possível perceber que a lista de notificações foi entregue de forma acumulada em um vetor, ou seja, no final de todas as alterações. Caso seja necessário intervir de forma antecipada o método Object.deliverChangeRecords garante uma chamada imediata do callback especificado (necessita ser um callback já aplicado) com uma lista das notificações pendentes:

Esta execução revelaria duas pilhas de notificações:

Object.getNotifier

Permite recuperar o objeto notificador e forçar uma notificação através do método notify():

É importante observarmos que implementações nativas tendem a ter um desempenho superior às implementações customizadas (ex. frameworks), e considerando este como apenas um dos aspectos das futuras implementações do ECMAScript 6 já podemos afirmar que elas representam um passo importante para a maturidade do desenvolvimento web.

Caso você não queira aguardar sentado o Javascript Harmony existem algumas alternativas como o Object.observe (polyfill/shim) ou a utilização do Chrome Canary com a flag “Enable Experimental JS APIs” ativada.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *