Observer.js

又手写了一遍，加深记忆