Я пытаюсь создать метод get и set для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Какое ключевое слово задает значение?
Typescript использует синтаксис getter/setter, подобный ActionScript3.
class foo {
private _bar:boolean = false;
get bar():boolean {
return this._bar;
}
set bar(theBar:boolean) {
this._bar = theBar;
}
}
Это создаст этот Javascript, используя функцию Ecmascript 5 Object.defineProperty().
var foo = (function () {
function foo() {
this._bar = false;
}
Object.defineProperty(foo.prototype, "bar", {
get: function () {
return this._bar;
},
set: function (theBar) {
this._bar = theBar;
},
enumerable: true,
configurable: true
});
return foo;
})();
Чтобы использовать его,
var myFoo = new foo();
if(myFoo.bar) { // calls the getter
myFoo.bar = false; // calls the setter and passes false
}
Однако, чтобы использовать его вообще, вы должны убедиться, что компилятор TypeScript нацелен на ECMAScript5. Если вы используете компилятор командной строки, используйте флаг --target, например:
tsc --target ES5
Если вы используете Visual Studio, вы должны отредактировать файл проекта, чтобы добавить флаг в конфигурацию для инструмента построения TypeScriptCompile. Вы можете видеть, что здесь:
Как поясняет @DanFromGermany, если вы просто читаете и пишете локальное свойство, например foo.bar = true, то наличие пары setter и getter является излишним. Вы всегда можете добавить их позже, если вам нужно что-то сделать, например, вести журнал, всякий раз, когда свойство читается или записывается.
Вот рабочий пример, который должен указать вам в правильном направлении:
class Foo {
_name;
get Name() {
return this._name;
}
set Name(val) {
this._name = val;
}
}
Getters и seters в JavaScript - это обычные функции. Setter - это функция, которая принимает параметр, значение которого задано.
static
.
static
.
Ezward уже предоставил хороший ответ, но я заметил, что один из комментариев спрашивает, как он используется. Для таких людей, как я, которые спотыкаются по этому вопросу, я подумал, что было бы полезно иметь ссылку на официальную документацию на геттеры и сеттеры на веб-сайте Typescript, так как это объясняет это хорошо, мы надеемся всегда оставаться в курсе последних событий сделаны изменения и показаны примеры использования:
http://www.typescriptlang.org/docs/handbook/classes.html
В частности, для тех, кто не знаком с ним, обратите внимание, что вы не включаете слово "get" в призыв к получателю (и аналогично для сеттеров):
var myBar = myFoo.getBar(); // wrong
var myBar = myFoo.get('bar'); // wrong
Вы должны просто сделать это:
var myBar = myFoo.bar; // correct (get)
myFoo.bar = 'new val'; // correct (set)
для данного класса:
class foo {
private _bar:boolean = false;
get bar():boolean {
return this._bar;
}
set bar(theBar:boolean) {
this._bar = theBar;
}
}
тогда будет вызываться 'bar' getter для частного свойства _bar.
Вы можете написать это
class Human {
private firstName : string;
private lastName : string;
constructor (
public FirstName?:string,
public LastName?:string) {
}
get FirstName() : string {
console.log("Get FirstName : ", this.firstName);
return this.firstName;
}
set FirstName(value : string) {
console.log("Set FirstName : ", value);
this.firstName = value;
}
get LastName() : string {
console.log("Get LastName : ", this.lastName);
return this.lastName;
}
set LastName(value : string) {
console.log("Set LastName : ", value);
this.lastName = value;
}
}
public
определяет дублирующихся членов.
Он очень похож на создание общих методов, просто поместите ключевое слово зарезервированное get
или set
в начале.
class Name{
private _name: string;
getMethod(): string{
return this._name;
}
setMethod(value: string){
this._name = value
}
get getMethod1(): string{
return this._name;
}
set setMethod1(value: string){
this._name = value
}
}
class HelloWorld {
public static main(){
let test = new Name();
test.setMethod('test.getMethod() --- need ()');
console.log(test.getMethod());
test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set ';
console.log(test.getMethod1);
}
}
HelloWorld.main();
В этом случае вы можете пропустить тип возврата в get getMethod1() {
get getMethod1() {
return this._name;
}
Думаю, я, наверное, понимаю, почему это так запутанно. В вашем примере нам нужны геттеры и сеттеры для _name
. Но мы достигаем этого, создавая геттеры и сеттеры для несвязанной переменной класса Name
.
Рассмотрим это:
class Car{
private tiresCount = 4;
get yourCarTiresCount(){
return this.tiresCount ;
}
set yourCarTiresCount(count) {
alert('You shouldn't change car tire count')
}
}
Выше код делает следующее:
get
и set
создать getter и setter для yourCarTiresCount
(не для tiresCount
).Геттер:
function() {
return this.tiresCount ;
}
а установщик:
function(count) {
alert('You shouldn't change car tire count');
}
Значение, каждый раз, когда мы делаем new Car().yourCarTiresCount
, выполняется getter. И для каждого new Car().yourCarTiresCount('7')
запускает сеттер.
tireCount
.