数组考虑性能原因没有用defineProperty对数组每一项进行拦截,而是选择重写数组(push、shift、pop、splice,unshift、sort、reverse)方法进行重写。

let state = [1,2,3]
let originalArray = Array.prototype;
let arrayMethods = Object.create(originalArray);
function defineReactive(obj){
	arrayMethods.push=function(...args){
		originalArray.push.call(this, ...args)
		render()
	}
	obj.__proto__ = arrayMethods;
}
defineReactive(state);

let render = (fn)=>{
	app.innerHTML = state;
}
render()
state.push(4)