Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES5的代理取代基_Javascript_Object_Ecmascript 5_Es5 Compatiblity - Fatal编程技术网

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