为什么不应该't我直接访问实例属性进行写操作
Why shouldn't I directly access Instance properties for write operations?
所以我最近读了这篇博客文章。作者说:
尽管直接访问和设置实例的属性仍然会引发我内部糟糕的javascript蜂鸣器。随着时间的推移,我受到了漏洞和技术债务的训练,以避免在实例上任意设置值作为传递信息的手段。
我以前听过这个建议,但我仍然不知道它有什么不好的地方。
我看到了在实际设置值之前验证值的可能性,但我应该如何处理糟糕的值?这是使用setter的唯一原因吗?
(对我来说)总是使用getter和setter而不是直接处理属性的最重要原因是,您总是可以在以后的时间点更改它们的行为方式。
因此,如果您发布了一个产品或库,该产品或库具有带有setName
方法的Cat
类,那么您总是可以决定在将来设置名称时还应该执行其他操作。例如,写入日志文件"名称已设置"或其他更有效的内容。
如果你不使用setter,你就会陷入困境,因为你的库的所有用户都直接使用了属性name
,所以你注定要永远保留这个属性,保留它的名称,永远不会更改它的任何内容——你会破坏你的用户过去用它构建的一切。
因此,对于其他人使用的公共API来说,这是最重要的。如果你留在内部,你仍然会在代码中有一个集中的点来改变行为。
看看区别:
myCat.name = "Silvester"
如果你在代码中有5次这样的情况,并且你想添加字符串"Cat:",你必须找到所有发生的情况,并添加"Cat:"。
如果您使用:
myCat.setName("Silvester");
只有一个地方可以更改,你可以很容易地找到它,你的用户甚至不会注意到你更改了什么。
使用Setter和Getter在其他语言中很常见。在Java中,我们有一个约定,JavaBean约定,它描述了Setter和Getter的用法。
使用Setter和Getter有两个设计原则:"关注的分离"answers"信息隐藏"。
第一个是说,一个任务或功能应该在一个对象/模块中实现,它不应该分布在代码中的几个地方,一个对象不应该实现几个不同的功能。
第二个说,对象应该隐藏使用对象提供的特性/逻辑所不需要的所有逻辑和实现细节。
如果将这些原则应用于包含数据的对象,或者甚至处理数据,则需要隐藏数据存储在其中的方式。这是由Setters和Getters完成的。
例如。对象的用户不需要知道数据是否只是一个属性,或者它是否由Map或Array持有。或者想象一个BUtton对象来绘制一个按钮。setColor()-函数可以只在Button中设置一个颜色属性,也可以委托给底层UI框架。
此外,我看到了JavaSCript的一个特殊情况。由于我们并没有真正的私有属性,所以很难隐藏对象中不打算由对象用户更改的属性,因为它们包含一些内部状态。因此,对象的调用者需要知道哪些属性可以更改,哪些属性不可以更改。。。这并不能使代码变得易读。。。使用Setter和Getter可以清楚地表明这一点。
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 为什么函数对象的实例没有继承函数原型属性
- 实例化一个javascript对象并在一行中填充其属性
- Backbone.Model.extend不创建实例属性
- 在定义了构造函数之后,是否可以将实例属性添加到JavaScript原型中
- 如何将占位符属性添加到 CKEditor 的实例
- 从原型方法更改实例属性
- 为下一次实例化设置的主干视图属性
- 如何将可拖动属性分配给所有实例
- 在 JavaScript 中按属性查找类实例
- 通过构造函数属性和运算符实例设置继承
- 在 IIFE 中使用实例属性
- 为什么 PrototypeJS 类实例共享相同的属性
- 在 ES6 中,允许解构类实例属性
- 在 ES6 中自动将参数设置为实例属性
- 如何将自定义属性添加到 HTML 环境,该属性将默认为元素的每个新实例上的空对象
- 用父属性实例化子类的Javascript
- 不使用"new"访问原型属性实例化函数对象
- 在JavaScript中,如何访问超类的属性'实例
- 使用可选属性实例化类的正确方法