2016-01-21 73 views
2

定义了一个对象。为什么使用setter方法,而不是直接在Javascript中更改属性?

var bob = {age: 10}; 

定义二传手为:

bob.setAge = function (newAge){ 
    bob.age = newAge; 
}; 

因此,我们可以更改属性为:

bob.setAge(20) 

而不是简单地:

bob.age = 20; 

bob["age"] = 20; 

是最佳实践的原因吗?

+1

您在问什么?你能分享一个*真实*的例子吗?在这种情况下,我不明白你为什么需要创建一个'setAge'函数。 'bob.age = 20;'在这里很好。如果“年龄”是一个“私人”成员,那么你需要一个二传手。 –

+0

因此,如果我运行'bob.age = -1',程序是否应该继续保持原样或者是否适合抛出错误? – zzzzBov

+0

恕我直言,这不是一个重复的问题,因为这是非常通用的,但这特别要求JavaScript的情况下。 – Gavriel

回答

3

因为这允许隐藏和保存对象的状态,防止意外的副作用

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()); 
+0

这并不能真正解释不了解模块/闭包/功能的人的原因。如果您举了一个例子,它会更有用 – Gavriel

+0

根据要求添加了一个示例。 –

1

对于获取器,它允许应用验证检查以确保只有正确的值将被设置。

除此之外,您可以封装变量的内部存储方法。例如,如果您将数据存储在数据库中,则可能会对数据进行加密,但在获取方中进行解密,以便自动准备好。