class AlleyVue{
constructor(options){
this.$options = options;
this.$data = options.data;
this.$el = document.querySelector(options.el);
this.observer(this.$data);
new Compile(this.$el,this);
}
observer(data){
if(!data || typeof data !=="object")return;
Object.keys(data).forEach(key=>{
this.defineRective(data,key,data[key]);
this.proxyData(key);
})
}
proxyData(key){
Object.defineProperty(this,key,{
get(){
return this.$data[key];
},
set(newVal){
this.$data[key] = newVal;
}
})
}
defineRective(data,key,val){
this.observer(val);
var dep = new Dep();
Object.defineProperty(data,key,{
get(){
Dep.target && dep.addDep(Dep.target);
return val;
},
set(newVal){
if(newVal == val)return;
val = newVal;
dep.notify();
}
})
}
}
class Dep{
constructor(){
this.deps = [];
}
addDep(dep){
this.deps.push(dep);
}
notify(){
this.deps.forEach((item)=>{
item.update();
})
}
}
class watcher{
constructor(node,vm,exp,cb){
this.$vm = vm;
this.$exp = exp;
this.cb = cb;
Dep.target = this;
this.$vm[this.$exp];
Dep.target = null;
}
update(){
this.cb.call(this.$vm,this.$vm[this.$exp]);
}
}
class AlleyVue{
constructor(options){
this.$options = options;
this.$data = options.data;
this.$el = document.querySelector(options.el);
this.observer(this.$data);
new Compile(this.$el,this);
}
observer(data){
if(!data || typeof data !=="object")return;
Object.keys(data).forEach(key=>{
this.defineRective(data,key,data[key]);
this.proxyData(key);
})
}
proxyData(key){
Object.defineProperty(this,key,{
get(){
return this.$data[key];
},
set(newVal){
this.$data[key] = newVal;
}
})
}
defineRective(data,key,val){
this.observer(val);
var dep = new Dep();
Object.defineProperty(data,key,{
get(){
Dep.target && dep.addDep(Dep.target);
return val;
},
set(newVal){
if(newVal == val)return;
val = newVal;
dep.notify();
}
})
}
}
class Dep{
constructor(){
this.deps = [];
}
addDep(dep){
this.deps.push(dep);
}
notify(){
this.deps.forEach((item)=>{
item.update();
})
}
}
class watcher{
constructor(node,vm,exp,cb){
this.$vm = vm;
this.$exp = exp;
this.cb = cb;
Dep.target = this;
this.$vm[this.$exp];
Dep.target = null;
}
update(){
this.cb.call(this.$vm,this.$vm[this.$exp]);
}
}