正在覆盖Object.obsoe()中的属性
Overwriting property in Object.observe()
我想使用Chrome的实验对象.obsobserve()来覆盖对象上设置的所有函数:
→jsFiddle
var obj = {};
Object.observe(obj, function (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 () {
};
data.object[data.name].isWrapper = true;
}
});
});
obj.helloWorld = function () {
console.log("helloWorld() was called");
};
obj.helloWorld();
不幸的是,控制台仍然显示"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
比特是由规范建议隐含授权的,还是仅仅是实现细节。
由于在没有明确执行Object.deliverChangeRecords
的修改代码的情况下,无法立即同步观察任何更改,因此这个API并不真正适合您想要实现的目标,至少在当前的规范建议中是这样。
Object.observe
的一个可行的替代方案可能是Proxy
,它实际上是用来做这样的事情的,IIRC也可以在Chrome中使用(打开了实验和声功能)。这是一把使用Proxy
的小提琴。
相关文章:
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 锚点元素的href属性自动更改
- jQuery最近父级的数据属性选择器
- 正在覆盖Object.obsoe()中的属性