2015-11-11 147 views
1

我想创建一个数据对象类型的包装。我希望能够在其上时,改变有以下两个方面的影响包装定义属性:你可以使用setter在属性上添加其他属性吗?

  1. 改变了包装的数据对应的属性值对象
  2. 将单独改变的记录到目前为止所有变化的列表

在最近了解到它的存在之后,好像JavaScript内置的getter和setter功能(特别是setter)是该工作的工具。这里有一个问题:我试图尽可能使其与现有的API大致相符,并且有问题的API字段不一定支持直接获取值,而是查询属性以查看它是否符合某些条件。

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

我当然可以很容易地通过指定一个明确的property.set(value)功能做到这一点,但在我看来,这样是最好的,如果可能避免冗余代码:感觉比=分配不太自然,并删除之间的(IMO)漂亮的语法区别修改属性并查询它。

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

回答

2

您可以让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 
+0

哈,辉煌!不知道为什么没有发生在我身上。现在唯一棘手的部分是确保我能够正确确定范围,因为我将为很多属性填充非常类似的函数,并且我希望保持DRY ...尽管如此,还是一个不同的问题,我希望我能回答自己。干杯! – endemic

相关问题