Javascript 覆盖Object.observe()中的属性
我想使用Chrome的实验功能来覆盖对象上设置的所有功能: 不幸的是,控制台仍然显示“helloWorld()已调用”。是否确实可以覆盖对象观察者中当前更改的值Javascript 覆盖Object.observe()中的属性,javascript,google-chrome,javascript-objects,ecmascript-harmony,object.observe,Javascript,Google Chrome,Javascript Objects,Ecmascript Harmony,Object.observe,我想使用Chrome的实验功能来覆盖对象上设置的所有功能: 不幸的是,控制台仍然显示“helloWorld()已调用”。是否确实可以覆盖对象观察者中当前更改的值 由于这只是一个实验(没有生产代码!),我很欣赏任何解决方案。好吧,你不能真正解决手头的问题。 但是,您可以在观察者中再次覆盖更改的值,除非显式调用了Object.deliverChangeRecords,因此只有在定义对象的同一轮中调用了obj.helloWorld()之后,才会执行该操作 我更新了您的应用程序,以显示: var ob
由于这只是一个实验(没有生产代码!),我很欣赏任何解决方案。好吧,你不能真正解决手头的问题。 但是,您可以在观察者中再次覆盖更改的值,除非显式调用了
Object.deliverChangeRecords
,因此只有在定义对象的同一轮中调用了obj.helloWorld()
之后,才会执行该操作
我更新了您的应用程序,以显示:
var obj = {};
function obs(changes) {
changes.forEach(function (data) {
if ((data.type == "new" || data.type == "updated") &&
typeof data.object[data.name] == "function" &&
typeof data.object[data.name].isWrapper == "undefined") {
data.object[data.name] = function () {
console.log("intercepted", data.name);
};
data.object[data.name].isWrapper = true;
}
});
}
Object.observe(obj, obs);
obj.helloWorld = function () {
console.log("helloWorld() was called");
};
// Will call the original function, as changes are not yet delivered.
obj.helloWorld();
Object.deliverChangeRecords(obs);
// Will call the intercepted function, as the changes were explicitly delivered synchronously.
obj.helloWorld();
obj.helloWorld2 = function () {
console.log("helloWorld2() was called");
};
// Will call the intercepted function, as first the changes will be delivered (end of turn) and only then the timeout callback will be called.
setTimeout(function() { obj.helloWorld2(); }, 0);
但是,不完全确定setTimeout
位是由spec提案隐式授权的还是仅仅是一个实现细节
由于如果修改代码不显式执行Object.deliverChangeRecords
,就无法立即同步观察任何更改,因此此API并不真正适合您试图实现的目标,至少在涉及当前规范提案时是如此
Object.observe
的一个可行的替代方案可能是,它实际上是用来做类似的事情的,并且IIRC在Chrome中也可用(启用了实验性的和声功能)。
这是。好吧,你不可能真正解决眼前的问题。 但是,您可以在观察者中再次覆盖更改的值,除非显式调用了
Object.deliverChangeRecords
,因此只有在定义对象的同一轮中调用了obj.helloWorld()
之后,才会执行该操作
我更新了您的应用程序,以显示:
var obj = {};
function obs(changes) {
changes.forEach(function (data) {
if ((data.type == "new" || data.type == "updated") &&
typeof data.object[data.name] == "function" &&
typeof data.object[data.name].isWrapper == "undefined") {
data.object[data.name] = function () {
console.log("intercepted", data.name);
};
data.object[data.name].isWrapper = true;
}
});
}
Object.observe(obj, obs);
obj.helloWorld = function () {
console.log("helloWorld() was called");
};
// Will call the original function, as changes are not yet delivered.
obj.helloWorld();
Object.deliverChangeRecords(obs);
// Will call the intercepted function, as the changes were explicitly delivered synchronously.
obj.helloWorld();
obj.helloWorld2 = function () {
console.log("helloWorld2() was called");
};
// Will call the intercepted function, as first the changes will be delivered (end of turn) and only then the timeout callback will be called.
setTimeout(function() { obj.helloWorld2(); }, 0);
但是,不完全确定setTimeout
位是由spec提案隐式授权的还是仅仅是一个实现细节
由于如果修改代码不显式执行Object.deliverChangeRecords
,就无法立即同步观察任何更改,因此此API并不真正适合您试图实现的目标,至少在涉及当前规范提案时是如此
Object.observe
的一个可行的替代方案可能是,它实际上是用来做类似的事情的,并且IIRC在Chrome中也可用(启用了实验性的和声功能)。
这是。非常感谢您的回答!关于术语“当前处理轮次(或“微任务”)(可在链接的MDN页面上找到),您是否有关于“微任务”的官方描述?我只发现一些论坛和邮件列表帖子描述了一个特定的“队列”,其中包含所谓的微任务。手头没有正式的描述(如果有的话)。简而言之,它只是意味着,在当前运行的代码完成运行之前,不会交付更改。因此,除非另有规定,否则为正常行为。例如,如果您运行
var i;setTimeout(函数(){i=2000000;},0);对于(i=0;i<100000;++i)代码>在当前执行上下文(草案8.3)完成之前,即for循环完成之后,不会运行超时回调。如果i
是Object.observe()d
,那么在for循环完成之前也不会调用观测者。该死,找错地方了。看到…谢谢你的研究和解释,我会看看那些链接!你应该得到你的赏金(21小时内)我很好奇Chrome是否支持足够多的代理,而且似乎确实如此。。。嗯,有点。请参阅更新的答案。(不过,我跳过了实现fix
)。非常感谢您的回答!关于术语“当前处理轮次(或“微任务”)(可在链接的MDN页面上找到),您是否有关于“微任务”的官方描述?我只发现一些论坛和邮件列表帖子描述了一个特定的“队列”,其中包含所谓的微任务。手头没有正式的描述(如果有的话)。简而言之,它只是意味着,在当前运行的代码完成运行之前,不会交付更改。因此,除非另有规定,否则为正常行为。例如,如果您运行var i;setTimeout(函数(){i=2000000;},0);对于(i=0;i<100000;++i)代码>在当前执行上下文(草案8.3)完成之前,即for循环完成之后,不会运行超时回调。如果i
是Object.observe()d
,那么在for循环完成之前也不会调用观测者。该死,找错地方了。看到…谢谢你的研究和解释,我会看看那些链接!你应该得到你的赏金(21小时内)我很好奇Chrome是否支持足够多的代理,而且似乎确实如此。。。嗯,有点。请参阅更新的答案。(不过,我跳过了实现fix
)。