A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cat73 黑马帝   /  2016-8-1 14:02  /  2953 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

10黑马币
本帖最后由 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 部分



最佳答案

查看完整内容

[mw_shl_code=javascript,true]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(My ...

6 个回复

倒序浏览
[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


点评

太棒了,没想到还真能做到!  发表于 2016-9-13 22:54
太棒了,没想到还真能做到!  发表于 2016-9-13 22:53

评分

参与人数 1黑马币 +10 收起 理由
cat73 + 10 感谢!

查看全部评分

回复 使用道具 举报
因为在JavaScript里,对象的“=”赋值只是地址的引用,因此,前面的你认为的赋值其实只是两次的改变了c所指向的地址而已, SO,debug_set 中无法捕获也不奇怪。

如果想在debug_set 中可以捕获,在引用了地址以后并对其值重新赋值,这样就可以了,debug_set 中应该就可以捕捉到了,希望可以帮到你。
回复 使用道具 举报
看不懂,喵~
回复 使用道具 举报
http://blog.csdn.net/long5305350/article/details/51578348

个人感觉angularjs里面MVVM模型。数据绑定那块用到的原理应该跟你这类似
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马