使用 get/set 访问器而不是标准 getter/setter 方法有什么优势?



来自Java,以这种方式编写类感觉更自然:

class Person1 {
private name: string;
constructor(name: string) {
this.name = name;
}
getName(): string {
return this.name;
}
}

根据 http://www.typescriptlang.org/play/,这被转换为相当简单的ES5代码:

var Person1 = /** @class */ (function () {
function Person1(name) {
this.name = name;
}
Person1.prototype.getName = function () {
return this.name;
};
return Person1;
}());

但是,官方文档使用关键字get&set如下所示:

class Person2 {
private _name: string;
constructor(name: string) {
this._name = name;
}
get name(): string {
return this._name;
}
}

这被翻译成这个:

var Person2 = /** @class */ (function () {
function Person2(name) {
this._name = name;
}
Object.defineProperty(Person2.prototype, "name", {
get: function () {
return this._name;
},
enumerable: true,
configurable: true
});
return Person2;
}());

生成的 ES5 代码是否有技术优势?

谢谢!

这个问题并不适合stackoverflow,因为你得到的任何答案都必然主要基于意见,但是:

公共属性优于 getter 和 setter 方法有几个原因,其中包括更干净的语法,以及减少的样板,因为您不必声明 getter 和 setter 方法。此外,在Javascript或Typescript中,您可能经常使用纯对象,例如:

type IPerson = {
name: string
};
class Person implements IPerson {
constructor (public name: string) {};
}
function greet(person: IPerson) {
console.log(`Hello ${person.name}`);
}
greet(new Person('Napoleon'));
greet({name: 'Snowball'});

现在,如果你真的需要在访问(或更新)属性时做一些花哨的事情,你可以有一个在属性上带有get/set的类:

class Person2 implements IPerson {
constructor(private _firstname: string, private _lastname: string) {
}
get name(): string {
return `${this._firstname} ${this._lastname}`;
}
}
greet(new Person2('Old', 'Major'))

但要记住的重要一点是,您不会定义get,如果他们唯一要做的就是访问私有属性,那么您将set,则没有理由这样做。

使用 getter 和 setter 仅在 Java 等语言中很普遍,在 Java 中,它是保护对对象属性的访问的唯一选项。在其他支持getset属性的语言中,简单地将属性公开为公共属性更为常见。然后,如果需要,您可以稍后更改类定义以使用getset,但前提是您需要它。以这种方式更改实现不需要对使用该类的代码进行任何更改。

这是重要的区别:在 Java 中,如果您需要从公共属性更改为计算属性,则必须更改影响使用该类的所有内容的声明接口,从而避免将属性公开为公共属性。在打字稿和大多数其他语言中,只有类实现会发生变化,而不是公开的接口。

最新更新