var obj = { set a (val) { this.b = val; }, get a () { return this.b; } };
我试着这样写确实能保持 obj.a 和 obj.b 取到同样的值,但感觉不太合适。 应该怎么写比较科学呢?
如果是IE9以下的浏览器又应该怎么实现?
ringa_lee
get/set应该是比较好的方案了,兼容什么的一定要做的话据说是可以用vbscript做的,不过代价有点大了。
另外一种方案是使用一个对象。obj.a={};obj.b=obj.a;,此时obj.a和obj.b是相同的。更新它们的属性会同步生效,比如obj.a.test=1;,此时obj.b.test也为1。
obj.a={};obj.b=obj.a;
obj.a
obj.b
obj.a.test=1;
obj.b.test
1
var obj = { c: 0, a: function(v){ return v ? (this.c = v) : this.c }, b: function(v){ return v ? (this.c = v) : this.c } } obj.c = 3 console.log(obj.a(5)) // 5 console.log(obj.b()) // 5
关于IE9以下的浏览器,除了VBscript的方案,再给你一个方案,就是用DOM对象:
js window.onload = function () { var obj = document.createElement("p"); obj.attachEvent("onpropertychange",function () { if (obj.b !== obj.a) { obj.b = obj.a; } }); //一定要append到页面上才能生效 document.body.appendChild(obj); obj.a = 2000; alert(obj.b); setTimeout(function () { obj.a = 200; alert(obj.b); }, 1000); }
js
window.onload = function () { var obj = document.createElement("p"); obj.attachEvent("onpropertychange",function () { if (obj.b !== obj.a) { obj.b = obj.a; } }); //一定要append到页面上才能生效 document.body.appendChild(obj); obj.a = 2000; alert(obj.b); setTimeout(function () { obj.a = 200; alert(obj.b); }, 1000); }
IE8可以把需要设置setter和getter的对象用document.createElement创建出来可以了,其他的直接声明的对象就可以用defineProperty IE8以下的现在不怎么需要管了吧
小页面上就随便弄了,楼上几位已经提出了解决办法:getter/setter、Dom 如果是大一点的,或者准备写成通用的组件的话,VBscript应该是最好的办法。avalon.js中有方案。 如果不会VBscript,那就写个发布订阅模式吧。
get/set应该是比较好的方案了,兼容什么的一定要做的话据说是可以用vbscript做的,不过代价有点大了。
另外一种方案是使用一个对象。
obj.a={};obj.b=obj.a;
,此时obj.a
和obj.b
是相同的。更新它们的属性会同步生效,比如obj.a.test=1;
,此时obj.b.test
也为1
。关于IE9以下的浏览器,除了VBscript的方案,再给你一个方案,就是用DOM对象:
IE8可以把需要设置setter和getter的对象用document.createElement创建出来可以了,其他的直接声明的对象就可以用defineProperty
IE8以下的现在不怎么需要管了吧
小页面上就随便弄了,楼上几位已经提出了解决办法:getter/setter、Dom
如果是大一点的,或者准备写成通用的组件的话,VBscript应该是最好的办法。avalon.js中有方案。
如果不会VBscript,那就写个发布订阅模式吧。