【发布时间】:2011-02-16 01:14:26
【问题描述】:
使用内置 javascript 对象的简单示例: navigator.my_new_property = "一些价值"; //我们可以检测到这个新属性被添加了吗?
我不想不断地轮询对象来检查新属性。 是否有某种更高级别的对象设置器,而不是明确说明要监视的属性?
同样,我不想检测属性值是否发生变化,而是要检测何时添加了新属性。
想法? 谢谢
【问题讨论】:
标签: javascript object properties
使用内置 javascript 对象的简单示例: navigator.my_new_property = "一些价值"; //我们可以检测到这个新属性被添加了吗?
我不想不断地轮询对象来检查新属性。 是否有某种更高级别的对象设置器,而不是明确说明要监视的属性?
同样,我不想检测属性值是否发生变化,而是要检测何时添加了新属性。
想法? 谢谢
【问题讨论】:
标签: javascript object properties
ES6 引入了代理的概念: es6 proxies on MDN.
这是一个简单的例子:
let objectToSpy = {};
let handler = {
set: (target, prop, value)=>{
console.log('new prop:', prop);
target[prop] = value;
}
};
let proxy = new Proxy(objectToSpy,handler);
proxy.testProp = 'bla'; //prints: "new prop: testProp"
【讨论】:
不。确定何时写入属性的现有方法:
defineProperty(obj, name, fn) 定义的 ECMAScript 5 设置器;__defineSetter__(name, fn) 定义的旧版 JavaScript 设置器;watch(name, fn);都是基于名称的,因此无法捕获使用以前未知名称编写的新属性。在任何情况下,navigator 可能是一个“宿主对象”,因此您不能依赖任何可用的普通 JavaScript Object 接口。
轮询或提供回调的显式 setter 方法几乎是您所能做的。
【讨论】:
navigator 这样的主机对象,甚至不能保证设置任何新属性,或者使用for...in 来迭代它们,会起作用! :-S