您可以在 属性 和 setter 上添加其他属性吗?

Can you add additional properties on a property with a setter?

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

  1. 更改包装数据对象中相应属性的值
  2. 将单个更改的记录添加到迄今为止所有更改的列表中

最近了解到它的存在,JavaScript 的内置 getter 和 setter 功能(好吧,具体来说 setter)似乎就是这个工具为了工作。这里有一个问题:我正在努力使它尽可能地大致符合现有的 API,并且有问题的 API 字段不一定支持直接获取值,而是查询属性 看是否符合某些条件。

例如,也许我有一个 car 对象 属性 car.color。我希望能够通过仅说 car.color = "blue"; 来设置此 属性,但我也希望能够调用一个函数 car.color.isBlue();,其中 returns 是否为真 [=44] =] 的值是 "blue" 或 "Blue" 或“#0000FF” 或我宁愿包装在函数中而不是每次都直接与值进行比较的许多情况中的任何一种。

我当然可以通过指定一个明确的 property.set(value) 函数来轻松地做到这一点,但在我看来,如果可能的话,这似乎是最好避免的麻烦:它感觉不如 = 赋值那么自然,并且删除了修改 属性 和查询它之间的(IMO)漂亮的语法区别。

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

您可以拥有 getter return 具有 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