我正在尝试为一种数据对象创建一个包装器。我希望能够在包装器上定义一个属性,当更改时具有以下两个效果:
最近了解到它的存在,似乎JavaScript的内置getter和setter功能(嗯,特别是setter)是这项工作的工具。这是一个问题:我试图尽可能地使它大致符合现有的API,并且有问题的API字段不一定支持直接获取值,而是查询属性以查看它是否与特定条件匹配。
例如,我可能有一个car
对象,其属性为car.color
。我希望能够通过只说car.color = "blue";
来设置此属性,但我也希望能够调用函数car.color.isBlue();
,该函数返回true,无论属性的值是“蓝色”还是“蓝色”或“#0000FF”或我宁愿包含在函数中的任何一种情况,而不是每次直接与值进行比较。
我当然可以通过指定一个明确的property.set(value)
函数轻松地做到这一点,但在我看来,如果可能的话,最好避免使用它:感觉不如使用=
进行赋值,并删除了(IMO)在修改属性和查询属性之间有很好的语法区别。
这感觉就像JavaScript(作为一般的精神事物)应该足够灵活以支持,但我尝试过的任何东西实际上都没有。那么,这实际上是可能的吗?更主观的是,如果答案是肯定的,有没有令人信服的理由说明为什么我不应该这样做呢?
答案 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;
}
});
};