ZetCode

JavaScript get 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 get 关键字在 JavaScript 对象中创建属性获取器。

get 关键字

get 关键字将对象属性绑定到一个函数,当访问该属性时,该函数将被调用。获取器提供了一种定义计算属性的方式。它们在被访问时执行一个函数,但表现为普通属性。

获取器使用 get 关键字定义,后跟属性名称和函数。它们不能接受参数,并且必须返回值。获取器通常与设置器配对,以实现完整的属性控制。

使用获取器可以使对象属性更加灵活,可以动态计算值。它们有助于封装内部状态,同时为使用者提供干净的类似属性的接口。

基本获取器示例

以下示例演示了使用 get 关键字创建简单获取器的基本用法。

main.js
const person = {
    firstName: 'John',
    lastName: 'Doe',
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    }
};

console.log(person.fullName);

此代码定义了一个 fullName 获取器,它结合了 firstName 和 lastName。当被访问时,它计算并返回全名。获取器像普通属性一样被调用,不需要括号。

$ node main.js
John Doe

带私有属性的获取器

获取器通常用于提供对私有属性的访问。

main.js
class Circle {
    #radius = 0;
    
    constructor(radius) {
        this.#radius = radius;
    }
    
    get area() {
        return Math.PI * this.#radius ** 2;
    }
}

const circle = new Circle(5);
console.log(circle.area);

此示例显示了一个获取器访问私有类字段。area 获取器根据其私有半径计算圆的面积。私有字段无法直接访问,但获取器提供了受控访问。

$ node main.js
78.53981633974483

带验证的获取器

获取器可以在返回值时包含验证逻辑。

main.js
const account = {
    _balance: 0,
    
    get balance() {
        if (this._balance < 0) {
            console.warn('Warning: Negative balance');
        }
        return this._balance;
    }
};

account._balance = -50;
console.log(account.balance);

此获取器在返回余额之前检查其是否为负数。虽然底层值可以被直接修改,但获取器添加了验证。在实际应用中,余额可能会被适当地封装。

$ node main.js
Warning: Negative balance
-50

带缓存的获取器

获取器可以实现缓存,以避免昂贵的重新计算。

main.js
const expensiveCalc = {
    _cache: null,
    _dirty: true,
    
    get result() {
        if (this._dirty) {
            console.log('Performing expensive calculation...');
            this._cache = Math.random() * 100;
            this._dirty = false;
        }
        return this._cache;
    },
    
    invalidate() {
        this._dirty = true;
    }
};

console.log(expensiveCalc.result);
console.log(expensiveCalc.result);
expensiveCalc.invalidate();
console.log(expensiveCalc.result);

此获取器缓存其结果,并且仅在需要时重新计算。_dirty 标志控制何时进行重新计算。此模式对于不经常更改的昂贵操作很有用。

$ node main.js
Performing expensive calculation...
42.123456789
42.123456789
Performing expensive calculation...
87.654321098

对象字面量中的获取器

可以使用 get 语法在对象字面量中定义获取器。

main.js
const rectangle = {
    width: 10,
    height: 20,
    
    get area() {
        return this.width * this.height;
    },
    
    get perimeter() {
        return 2 * (this.width + this.height);
    }
};

console.log('Area:', rectangle.area);
console.log('Perimeter:', rectangle.perimeter);

此对象定义了两个获取器,用于计算几何属性。获取器使用对象的 width 和 height 属性。当访问这些属性时,计算会动态执行。

$ node main.js
Area: 200
Perimeter: 60

带设置器的获取器

获取器通常与设置器配对以实现完整的属性控制。

main.js
class Temperature {
    _celsius = 0;
    
    get fahrenheit() {
        return this._celsius * 9/5 + 32;
    }
    
    set fahrenheit(value) {
        this._celsius = (value - 32) * 5/9;
    }
}

const temp = new Temperature();
temp.fahrenheit = 77;
console.log(`Celsius: ${temp._celsius.toFixed(1)}`);
console.log(`Fahrenheit: ${temp.fahrenheit.toFixed(1)}`);

此类使用获取器/设置器对在摄氏度和华氏度之间进行转换。获取器从摄氏度计算华氏度,而设置器则相反。这保持了两个温度尺度之间的一致性。

$ node main.js
Celsius: 25.0
Fahrenheit: 77.0

原型中的获取器

可以在对象的原型上定义获取器,以实现共享行为。

main.js
function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

Person.prototype = {
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    }
};

const person = new Person('Jane', 'Smith');
console.log(person.fullName);

此示例将获取器添加到 Person 原型。所有 Person 实例都将共享此获取器。获取器可以通过 this 访问实例属性。这是一种添加计算属性的内存有效方式。

$ node main.js
Jane Smith

来源

get - 语言参考

在本文中,我们演示了如何使用 get 关键字在 JavaScript 中创建属性获取器。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。