定义了一个对象。为什么使用setter方法,而不是直接在Javascript中更改属性?
var bob = {age: 10};
定义二传手为:
bob.setAge = function (newAge){
bob.age = newAge;
};
因此,我们可以更改属性为:
bob.setAge(20)
而不是简单地:
bob.age = 20;
或
bob["age"] = 20;
是最佳实践的原因吗?
定义了一个对象。为什么使用setter方法,而不是直接在Javascript中更改属性?
var bob = {age: 10};
定义二传手为:
bob.setAge = function (newAge){
bob.age = newAge;
};
因此,我们可以更改属性为:
bob.setAge(20)
而不是简单地:
bob.age = 20;
或
bob["age"] = 20;
是最佳实践的原因吗?
因为这允许隐藏和保存对象的状态,防止意外的副作用
bob.setAge = function (newAge){
bob.age = newAge || 0; // age must never be undefined or null;
};
您必须包装一切都在一个模块/关闭/函数实际上隐藏携带对象状态的字段。
var user = (function() {
var name = '';
function getName() {
return name;
}
function setName(value) {
if (!value) {
console.warn('setName: empty value passed');
}
name = value || '';
}
return {
getName: getName,
setName: setName
};
}());
// undefined, the variable could not be resolved
console.info(user['name']);
user.setName('Sergio Prada');
console.info(user.getName());
// warning
user.setName(null);
// empty string, undefined or null will never be returned
console.info(user.getName());
这并不能真正解释不了解模块/闭包/功能的人的原因。如果您举了一个例子,它会更有用 – Gavriel
根据要求添加了一个示例。 –
对于获取器,它允许应用验证检查以确保只有正确的值将被设置。
除此之外,您可以封装变量的内部存储方法。例如,如果您将数据存储在数据库中,则可能会对数据进行加密,但在获取方中进行解密,以便自动准备好。
您在问什么?你能分享一个*真实*的例子吗?在这种情况下,我不明白你为什么需要创建一个'setAge'函数。 'bob.age = 20;'在这里很好。如果“年龄”是一个“私人”成员,那么你需要一个二传手。 –
因此,如果我运行'bob.age = -1',程序是否应该继续保持原样或者是否适合抛出错误? – zzzzBov
恕我直言,这不是一个重复的问题,因为这是非常通用的,但这特别要求JavaScript的情况下。 – Gavriel