获取并设置在TypeScript中
我正在尝试创build一个属性get和set方法:
private _name: string; Name() { get: { return this._name; } set: { this._name = ???; } }
什么是关键字来设置一个值?
Typescript使用类似于ActionScript3的getter / setter语法。
class foo { private _bar:boolean = false; get bar():boolean { return this._bar; } set bar(theBar:boolean) { this._bar = theBar; } }
这将产生这个Javascript,使用Ecmascript 5 Object.defineProperty()function。
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构build工具的configuration中。 你可以在这里看到:
正如@DanFromGermany在下面build议的那样,如果你只是读和写一个像foo.bar = true这样的本地属性,那么拥有setter和getter对是矫枉过正的。 如果您需要执行某些操作(如日志logging),则只要读取或写入属性,就可以随后添加它们。
这是一个应该指向正确方向的工作示例:
class Foo { _name; get Name() { return Foo._name; } set Name(val) { Foo._name = val; } }
getter和setter在JavaScript中只是正常的function。 setter是一个函数,它接受一个参数,其值是被设置的值。
Ezward已经提供了一个很好的答案,但是我注意到其中的一个评论问如何使用它。 对于像我这样偶然发现这个问题的人,我认为在Typescript网站上有一个关于getter和setter官方文档的链接是很有用的,因为这样可以很好地解释这个问题,希望能随时更新并显示示例用法:
http://www.typescriptlang.org/docs/handbook/classes.html
特别是对那些不熟悉它的人来说,注意你并没有将“get”这个词join到一个getter的调用中(对于setters来说也是如此):
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”属性的“bar”getter将被调用。
你可以写这个
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; } }
这与创build常用方法非常相似,只需将关键字reserved 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();
在这种情况下,你可以跳过返回typesget getMethod1() {
get getMethod1() { return this._name; }
我想我可能会明白为什么这么混乱。 在你的例子中,我们需要_name
getter和setter。 但是我们通过为一个不相关的类variablesName
创buildgetter和setter来达到这个目的。
考虑这个:
class Car{ private tiresCount = 4; get yourCarTiresCount(){ return this.tiresCount ; } set yourCarTiresCount(count) { alert('You shouldn't change car tire count') } }
上面的代码如下:
-
get
并set
创buildgetter和setter为您的yourCarTiresCount
( 不为tiresCount
)。
Getter是:
function() { return this.tiresCount ; }
和二传手是:
function(count) { alert('You shouldn't change car tire count'); }
意思是,每次我们做new Car().yourCarTiresCount
,getter都会运行。 对于每一个new Car().yourCarTiresCount('7')
setter运行。
- 间接创buildgetter,但不是setter,用于private
tireCount
。