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

时间:2015-11-11 21:11:23

标签: javascript javascript-objects setter getter-setter

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

  1. 更改已包装数据对象中相应属性的值
  2. 将个别更改的记录添加到目前为止所有更改的列表
  3. 最近了解到它的存在,似乎JavaScript的内置getter和setter功能(嗯,特别是setter)是这项工作的工具。这是一个问题:我试图尽可能地使它大致符合现有的API,并且有问题的API字段不一定支持直接获取值,而是查询属性以查看它是否与特定条件匹配。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

这样的东西
<TableSection>
    <ViewCell>
        <ListView>
            <ListView.Content>
                <StackLayout>
                    <Label Text="Testing123"/>
                </StackLayout>
            </ListView.Content>
    <ListView>
</ViewCell>

然后

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;
        }
    });
};