为什么要使用setter之类的方法,而不是直接在Javascript中更改属性?

为什么要使用setter之类的方法,而不是直接在Javascript中更改属性?,javascript,methods,setter,Javascript,Methods,Setter,定义了一个对象 var bob = {age: 10}; 将setter定义为: bob.setAge = function (newAge){ bob.age = newAge; }; 因此,我们可以将属性更改为: bob.setAge(20) 而不是简单地: bob.age = 20; 或 最佳实践是原因吗?因为这样可以隐藏和保存对象的状态,以防产生不必要的副作用 bob.setAge = function (newAge){ bob.age = newAge || 0; /

定义了一个对象

var bob = {age: 10};
将setter定义为:

bob.setAge = function (newAge){
  bob.age = newAge;
};
因此,我们可以将属性更改为:

bob.setAge(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());

对于getter,它允许应用验证检查,以确保只设置正确的值


除此之外,还可以封装变量的内部存储方法。例如,如果要将数据存储在数据库中,则可以对其进行加密,但要在getter中进行解密,使其自动就绪

您在问什么?你能分享一个真实的例子吗?在这种情况下,我不明白为什么需要创建一个设置函数。年龄=20岁;这里天气很好。如果age是一个私有成员,那么您需要一个setter。因此,如果我运行bob.age=-1,程序应该按原样继续运行,还是应该抛出一个错误?我想这不是这个问题的重复,因为这是非常通用的,但是对于javascript来说,这是一个特别的问题。javascript中没有什么特殊的东西不会使它重复。这并不能向不了解module/closure/function的人解释原因。如果你给出一个例子,那么按照要求添加一个例子会更有用。
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());