gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:28:52 24 4
gpt4 key购买 nike

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

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

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

例如,也许我有一个具有属性 car.colorcar 对象。我希望能够通过说 car.color = "blue"; 来设置这个属性,但我也希望能够调用函数 car.color.isBlue(); 无论属性值是“blue”、“Blue”或“#0000FF”,还是我宁愿将其包装在函数中而不是每次都直接与值进行比较的任何一种情况,它都会返回 true .

我当然可以通过指定一个显式的 property.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

关于javascript - 您可以使用 setter 在属性上添加其他属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com