Javascript 可以使用setter在属性上添加其他属性吗?

Javascript 可以使用setter在属性上添加其他属性吗?,javascript,javascript-objects,setter,getter-setter,Javascript,Javascript Objects,Setter,Getter Setter,我正在尝试为一种类型的数据对象创建包装器。我希望能够在包装器上定义一个属性,该属性在更改时具有以下两种效果: 更改包装数据对象中相应属性的值 将单个更改的记录添加到迄今为止所有更改的列表中 最近了解到它的存在,JavaScript的内置getter和setter功能(特别是setter)似乎就是这项工作的工具。这里有一个陷阱:我试图使它尽可能与现有的API大致一致,并且所讨论的API字段不一定支持直接获取值,而是查询属性以查看它是否符合某些条件 例如,可能我有一个属性为car.color的car

我正在尝试为一种类型的数据对象创建包装器。我希望能够在包装器上定义一个属性,该属性在更改时具有以下两种效果:

  • 更改包装数据对象中相应属性的值
  • 将单个更改的记录添加到迄今为止所有更改的列表中
  • 最近了解到它的存在,JavaScript的内置getter和setter功能(特别是setter)似乎就是这项工作的工具。这里有一个陷阱:我试图使它尽可能与现有的API大致一致,并且所讨论的API字段不一定支持直接获取值,而是查询属性以查看它是否符合某些条件

    例如,可能我有一个属性为
    car.color
    car
    对象。我想通过说
    car.color=“blue”来设置这个属性,但我还希望能够调用函数
    car.color.isBlue()
    返回true,无论属性的值是“blue”还是“blue”或“#0000FF”,或者是我希望包装在函数中而不是每次直接与值进行比较的任何情况

    当然,通过指定一个显式的
    属性.set(value)
    函数,我可以很容易地做到这一点,但在我看来,如果可能的话,这似乎是最好避免的错误:它感觉比
    =
    赋值更不自然,并且消除了(IMO)修改属性和查询属性之间的语法区别


    这感觉像是JavaScript(作为一种普遍的精神气质)应该足够灵活来支持的东西,但我尝试过的任何东西实际上都不起作用。那么,这真的可能吗?更主观地说,如果答案是肯定的,是否有任何令人信服的理由说明我不应该这样做?

    您可以让getter返回一个具有isBlue函数的对象

    差不多

    function ColoredThing(color){
        var colorValue = color;
        var colorProperty = { isBlue: function(){
            return colorValue === "blue";
        }}
    
        Object.defineProperty(this, "color",{
            get: function(){
                return colorProperty;
            },
            set: function(color){
                //track history, whatever.
                colorValue = color;
            }
        });
    };
    
    然后


    哈,太棒了!不知道为什么我没有想到。现在唯一棘手的部分将是确保范围正确,因为我将为许多属性填充非常相似的函数,我希望保持干燥。。。这是一个不同的问题,我希望我能自己回答。干杯
        var thing = new ColoredThing("blue");
        var color = thing.color
        var isBlue = color.isBlue(); //isBlue == true
        thing.color = "red";
        isBlue = color.isBlue(); //isBlue == false