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

rap*_*cke 3 typescript

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

class Person1 {

    private name: string;
    constructor(name: string) {
        this.name = name;
    }

    getName(): string {
        return this.name;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据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;
}());
Run Code Online (Sandbox Code Playgroud)

但是,官方文档使用关键字getset像这样:

class Person2 {

    private _name: string;
    constructor(name: string) {
        this._name = name;
    }

    get name(): string {
        return this._name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这被翻译成这个:

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;
}());
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Dun*_*can 5

这个问题并不是太适合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'});
Run Code Online (Sandbox Code Playgroud)

现在,如果实际上需要在访问(或更新)该属性时做一些花哨的事,则可以在该属性上带有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'))
Run Code Online (Sandbox Code Playgroud)

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

仅在Java之类的语言中普遍使用getter和setter方法,因为它是保护对对象属性访问的唯一选择。在其他支持getset属性的语言中,将属性公开为公共状态更为普遍。然后,如果需要,您可以稍后更改类定义以使用getset,但仅在需要时才更改。以这种方式更改实现不需要对使用该类的代码进行任何更改。

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