javascript - JS里更改对象的属性值时,如何同步更新到另外一个属性
ringa_lee
ringa_lee 2017-04-10 14:59:45
[JavaScript讨论组]
var obj = {
    set a (val) {
        this.b = val;
    },
    get a () {
        return this.b;
    }
};

我试着这样写确实能保持 obj.a 和 obj.b 取到同样的值,但感觉不太合适。
应该怎么写比较科学呢?

如果是IE9以下的浏览器又应该怎么实现?

ringa_lee
ringa_lee

ringa_lee

全部回复(5)
PHPz

get/set应该是比较好的方案了,兼容什么的一定要做的话据说是可以用vbscript做的,不过代价有点大了。

另外一种方案是使用一个对象。obj.a={};obj.b=obj.a;,此时obj.aobj.b是相同的。更新它们的属性会同步生效,比如obj.a.test=1;,此时obj.b.test也为1

PHP中文网
    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);
    }
阿神

IE8可以把需要设置setter和getter的对象用document.createElement创建出来可以了,其他的直接声明的对象就可以用defineProperty
IE8以下的现在不怎么需要管了吧

PHPz

小页面上就随便弄了,楼上几位已经提出了解决办法:getter/setter、Dom
如果是大一点的,或者准备写成通用的组件的话,VBscript应该是最好的办法。avalon.js中有方案。
如果不会VBscript,那就写个发布订阅模式吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号