9. Class类
在js中,类是一个特殊的函数,在这个函数中不仅可以定义函数表达,也可以声明这个函数,在类的语法中,包含两个部分:定义与声明。
怎么去理解面对对象、对象以及类呢?简单来说,对象就是一条狗子,类class就是对它的描述。
它能被大家看到的圆脑袋、大耳朵是它的公有属性;
它是男孩女孩只有它自己知道,这就是私有属性;
狗子会吃饭会睡觉会咬人,这是它的(成员)方法;而它只会对我摇尾巴撒娇,这是私有(成员)方法;
而我每天要对它喂水喂饭,这是传参;
---------------------------------------------------------------------------------------------------------------------------------
在对象外部直接访问内部成员变量甚至重新赋值,是不希望的,一般来说我们希望避免外界直接操作class内部属性
这时候就可以使用Access Modifier访问修饰符对访问class内部的方法或者变量加以限制
ts中,默认情况下所有的成员变量以及成员方法都是public,如果把我们的x 和 y 用private修饰,在外部访问时就会报错,这样就会避免一些问题的产生。
当我们把x 和 y 改为私有属性时,Point类就报错了(Point类没有正确实现IPoint接口)。一般来说,在面向对象的概念中,接口就相当于一份说明书,在接口中定义的内容,不管是变量还是方法,全部都是公开的。可以在接口中删除掉定义的变量来处理。
但是有些时候我们还是需要从外部访问x 和 y ,当删除掉接口中的变量后,我们的p.y是无法访问到这个成员变量的,这时候就可以借助getter 和 setter 方法。
所以我们把x属性变为私有属性时,给x赋值的唯一选择就是使用setter函数。
比如我们在赋值时,要求 x 和 y 都不能小于零,我们可以创建setX()方法,参数就是我们想要设定的具体数据。我们使用setX方法把 x 分别设置为10 和 -9,虽然编译器不会报错,但是运行代码是会报错的。
setter方法就相当于在class内部建立一个缓冲带,通过缓冲带可以避免一些意料之外的非法输入。
当我们想要获取到函数中的数据时,就可以使用getter函数。
当我们完成获取x 和 y 坐标的方法,并且在IPoint中写入set get方法后,就可以在getDistances()中调用了。
在ts中,set get还有另外一种写法。可以称之为懒人包的写法。
需要赋值直接就是point.X 等于具体的数据,直接console.log就可以调用。这样处理的
好处就是get 和set不需要再写繁琐的代码,在进行赋值和调用时也不需要像函数一样调用,只需要像class的属性一样来使用就可以了。代码更加整洁。
这样写的话,在getDistances()调用时也要符合懒人包的定义。在接口中直接写大写X、Y表示接口的属性,在getDistances()中直接 .X就可以了。
但是编译时会报错( Accessors are only available when targeting ECMAScript 5 and higher.)使用懒人包对ES的版本有要求。输入命令 tsc -target es5 文件名就可以啦。