Javascript 覆盖Object.observe()中的属性

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

我想使用Chrome的实验功能来覆盖对象上设置的所有功能:

不幸的是,控制台仍然显示“helloWorld()已调用”。是否确实可以覆盖对象观察者中当前更改的值


由于这只是一个实验(没有生产代码!),我很欣赏任何解决方案。

好吧,你不能真正解决手头的问题。 但是,您可以在观察者中再次覆盖更改的值,除非显式调用了
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
)。