JavaScript使用getter和setter

JavaScript使用getter和setter,通过使用get和set,我们可以在读取对象的属性(在get的情况下)或写入对象的属性(在set的情况下)时,运行特定代码。例如,可以用set来检查将要用来设置一个属性值的某些数据的有效性,或者用get返回一个计算的或特定格式的值。

如果为一个对象定义了get和set,在通过常规的点表示法来访问对象的属性和方法时,就会显式地调用它们。例如,假设在对象obj之上定义了如下的getter:

get name() {
    return this.name.toUpperCase();
}

那么,当访问name的值时,这个getter将执行如下的代码:

obj.name = "Sandy";
console.log(obj.name); // 向控制台输出"SANDY"

当设置属性的值时,同样的原则也是适用的:如果已经用set关键字创建了一个setter,任何时候,一旦试图修改一个对象属性的这个值,将会在后台调用这个setter。

为了展示这一点,让我们回到Pet类。假设以任何新的值来作为一个宠物的名字时,想要通过代码将其名称的首字母大写,就可以用一个setter来做到这一点:

class Pet {
    constructor(animal, name) {
        this.animal = animal,
        this.name = name
    }
    setAnimal(newAnimal) {
        this.animal = newAnimal;
    }
    setName(newName) {
        this.name = newName;
    }
    get name() {
        return this._name;
    }
    set name(n) {
        // 将第一个字母设置为大写,其他的字母保持小写
        n = n.charAt(0).toUpperCase() + n.slice(1).toLowerCase();
        this._name = n;
    }
}

注意,在getter和setter中,name属性现在以一个下画线字符作为前缀,成了_name。使用这个下画线是必需的,为了防止JavaScript解释器中的一种情况,即由于没有这一预防措施而导致get被重复调用,由此形成一个无限循环,并且最终导致程序因栈溢出而停止运行。实际上,要隐藏私有的、内部的属性值_name,而允许外界访问name属性。

现在让我们来看看,在用如下这行代码创建并修改Pet类的一个实例时,将会发生什么:

var myCat = new Pet("cat", "sylvester");

控制台的输出如图所示:

JavaScript使用getter和setter

getter和setter是在读取和写入一个对象的属性时自动运行代码的一种方便方法。使用它们,可以不允许直接给对象的属性赋值,而是通过一个setter方法来控制所有赋值,从而保证实际的对象属性是私有的。

注意:私有性是相对的
记住,这样的对象属性并不真正是私有的。代码(或者其他某人的代码)仍然能够直接访问myCat._name的值。如果需要一个更加安全的私有属性,一种更好的方法是使用Symbol数据类型。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!