来自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;
}());
但是,official documentation使用关键字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代码是否有技术优势?
谢谢!
答案 0 :(得分:3)
这个问题并不适合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等语言中很流行,它是保护对象上属性访问的唯一选择。在支持get
和set
属性的其他语言中,将属性公开为public是更常见的。然后,如果需要,您可以稍后更改类定义以使用get
和set
,但前提是您需要它。以这种方式更改实现不需要对使用该类的代码进行任何更改。
这是一个重要的区别:在Java中,如果需要从公共属性更改为计算属性,则必须更改声明的接口,从而影响使用该类的所有内容,因此您可以避免将属性公开为public。在打字稿和大多数其他语言中,只有类实现发生变化,而不是暴露的界面。