Javascript ES5的代理取代基
是否可以在不使用Javascript ES5的代理取代基,javascript,object,ecmascript-5,es5-compatiblity,Javascript,Object,Ecmascript 5,Es5 Compatiblity,是否可以在不使用代理和设置间隔的情况下侦听属性更改 对于常见对象,可以使用下面的函数,但该函数适用于所有现有属性,但不适用于包装后可能添加的任何属性 函数换行(obj){ var target={}; Object.keys(obj).forEach(函数(key){ 目标[键]=对象[键]; Object.defineProperty(对象、键、{ get:function(){ console.log(“Get”); 返回目标[键]; }, set:函数(newValue){ consol
代理
和设置间隔
的情况下侦听属性更改
对于常见对象,可以使用下面的函数,但该函数适用于所有现有属性,但不适用于包装后可能添加的任何属性
函数换行(obj){
var target={};
Object.keys(obj).forEach(函数(key){
目标[键]=对象[键];
Object.defineProperty(对象、键、{
get:function(){
console.log(“Get”);
返回目标[键];
},
set:函数(newValue){
console.log(“Set”);
目标[键]=新值;
}
});
});
}
var obj={
答:2,,
b:3
};
包裹(obj);
目标a;//得到
目标a=2;//设置
对象b;//得到
对象b=2;//设置
对象c=2;//没有什么
对象c;//没什么
遗憾的是,没有,这就是代理如此重要的原因。目前,除了代理之外,没有其他方法可以在向对象添加属性时触发代码
正如您所说,您可以使用Object.defineProperty
或var a={get x(){…},set x(value){…}
但不检测新属性
大多数框架依赖于脏检查:在给定时间比较对象。时间是主要的区别所在 AngularJS(Angular1.x)为异步操作提供了特殊的函数,如
$timeout
和$http
,它还以自己的方式侦听DOM事件,这些事件将包装回调并在代码后运行检查
Angular(Angular 2到N)用于为代码创建“运行上下文”,Zone.js会拦截任何异步回调。它基本上与AngularJS的解决方案相同,但可以自动工作
React会执行类似的操作,但它不会跟踪变量,而是运行渲染器并比较生成的DOM(虚拟DOM)是否不同。否,在ES5中不能这样做。@Bergi像angular这样的单页应用程序是如何做到的<代码>设置间隔?在过去?是的,我认为是这样,超时或显式触发脏检查。您基本上需要使用angular提供的
$http
,它包装http调用以在最后进行摘要。它们还有一个$timeout
和$interval
,类似于setTimeout
和setInterval
。当您创建这样的框架时,您需要使用框架中提供的所有方法,或者您可以调用$scope.$digest()
来手动触发摘要,如果您在“角度”之外执行某些操作Angularjs遵循一种称为脏检查
的方法,基本上是从根作用域
到所有子作用域,在作用域
值发生变化时,对其观察者列表进行迭代。这种情况经常在后台发生,每次运行都称为一个摘要周期
。它们的内部结构可能会变得非常复杂,因此始终建议使用它们的包装方法(例如:$timeout而不是setTimeout
)