黑马程序员技术交流社区

标题: JavaScript 任意属性赋值 Hook [打印本页]

作者: cat73    时间: 2016-8-1 14:02
标题: JavaScript 任意属性赋值 Hook
本帖最后由 cat73 于 2016-8-1 15:26 编辑

看代码:
[JavaScript] 纯文本查看 复制代码

var obj = {};

// 给任意名称的属性赋值
obj.a = 1;
obj.b = "123";
obj.xxx = obj;
obj.cat = false;
obj["123"] = 123;

function debug_set(name, value) {
    console.log("set", name, value);
}

现在问题来了,我希望在给任意名称的属性赋值的时候,都可以立刻被我写的 debug_set 方法捕获到。
赋值语句不能变,要如何写才能让 obj 的属性被赋值的时候被 debug_set 捕获到呢?

因为属性名不确定,所以 setter 方法大概是没什么卵用了。
相关 ECMA 规范:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
请看 9.1.9.1 部分




作者: gong19931016    时间: 2016-8-1 14:02
[JavaScript] 纯文本查看 复制代码
MyObj = new Proxy({}, {
    get: function(target, name, receiver) {
        var temp = target[name];
        console.log('You are gettting:'+name);
        return temp;
      } ,set: function(target, name, value) {
        target[name]=value;
                console.log('You are setting:'+ name);
                console.log('Value is:')
                console.log(value)
      }
});
var testObj = new Object(MyObj);
testObj.hi = 'Hello'

https://msdn.microsoft.com/zh-cn/library/dn911714(v=vs.94).aspx



作者: yezilail    时间: 2016-8-3 12:46
因为在JavaScript里,对象的“=”赋值只是地址的引用,因此,前面的你认为的赋值其实只是两次的改变了c所指向的地址而已, SO,debug_set 中无法捕获也不奇怪。

如果想在debug_set 中可以捕获,在引用了地址以后并对其值重新赋值,这样就可以了,debug_set 中应该就可以捕捉到了,希望可以帮到你。
作者: 刘小白    时间: 2016-8-3 21:56
看不懂,喵~
作者: 杨凯233    时间: 2016-9-9 19:56
http://blog.csdn.net/long5305350/article/details/51578348

个人感觉angularjs里面MVVM模型。数据绑定那块用到的原理应该跟你这类似




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2