属性方法

实例的属性、方法

定义在构造函数中,或者直接定义;

  1. class Animal {
  2. constructor(public name: string, public legsNum: number) {
  3. this.name = name;
  4. this.legsNum = legsNum;
  5. }
  6. }
  7. class Dog extends Animal {
  8. public static kind: string = "秋田"; //定义 类的属性
  9. public static sayKind() {
  10. //定义 类的方法
  11. return "I am " + this.kind + " 犬";
  12. }
  13. // constructor中定义的是 实例属性
  14. constructor(public name: string, public legsNum: number, public age: number) {
  15. super(name, legsNum);
  16. this.age = age;
  17. }
  18. // 直接定义,也是定义的 实例属性
  19. private color: string = "black";
  20. // 定义 实例方法,也是 原型方法,编译后方法say会在 Dog.prototype.say Dog的构造函数原型上
  21. say() {
  22. console.log("I am " + this.age + " years old");
  23. }
  24. /****** 定义原型属性, ****** */
  25. get value() {
  26. return this.color;
  27. }
  28. set value(newValue) {
  29. this.color = newValue;
  30. }
  31. }
  32. let animal = new Animal("动物", 0);
  33. let dog = new Dog("旺财", 4, 2);
  34. console.log(Dog.kind);
  35. console.log(Dog.sayKind());
  36. dog.say();
  37. console.log(dog.value);
  38. dog.value = "white";
  39. console.log(dog.value);

类的属性、方法

通过类中的static实现
用static定义的属性或方法,只能通过类使用,如:kind和sayKind

  1. class Animal {
  2. constructor(public name: string, public legsNum: number) {
  3. this.name = name;
  4. this.legsNum = legsNum;
  5. }
  6. }
  7. class Dog extends Animal {
  8. public static kind: string = "秋田"; //定义 类的属性
  9. public static sayKind() {
  10. //定义 类的方法
  11. return "I am " + this.kind + " 犬";
  12. }
  13. // constructor中定义的是 实例属性
  14. constructor(public name: string, public legsNum: number, public age: number) {
  15. super(name, legsNum);
  16. this.age = age;
  17. }
  18. // 直接定义,也是定义的 实例属性
  19. private color: string = "black";
  20. // 定义 实例方法,也是 原型方法,编译后方法say会在 Dog.prototype.say Dog的构造函数原型上
  21. say() {
  22. console.log("I am " + this.age + " years old");
  23. }
  24. /****** 定义原型属性, ****** */
  25. get value() {
  26. return this.color;
  27. }
  28. set value(newValue) {
  29. this.color = newValue;
  30. }
  31. }
  32. let animal = new Animal("动物", 0);
  33. let dog = new Dog("旺财", 4, 2);
  34. console.log(Dog.kind);
  35. console.log(Dog.sayKind());
  36. dog.say();
  37. console.log(dog.value);
  38. dog.value = "white";
  39. console.log(dog.value);

原型的属性、方法

通过类中关键字set、get实现;通过属性访问器定义原型属性
对value的定义,会挂载到Dog.prototype.value上

  1. class Animal {
  2. constructor(public name: string, public legsNum: number) {
  3. this.name = name;
  4. this.legsNum = legsNum;
  5. }
  6. }
  7. class Dog extends Animal {
  8. public static kind: string = "秋田"; //定义 类的属性
  9. public static sayKind() {
  10. //定义 类的方法
  11. return "I am " + this.kind + " 犬";
  12. }
  13. // constructor中定义的是 实例属性
  14. constructor(public name: string, public legsNum: number, public age: number) {
  15. super(name, legsNum);
  16. this.age = age;
  17. }
  18. // 直接定义,也是定义的 实例属性
  19. private color: string = "black";
  20. // 定义 实例方法,也是 原型方法,编译后方法say会在 Dog.prototype.say Dog的构造函数原型上
  21. say() {
  22. console.log("I am " + this.age + " years old");
  23. }
  24. /****** 定义原型属性, ****** */
  25. get value() {
  26. return this.color;
  27. }
  28. set value(newValue) {
  29. this.color = newValue;
  30. }
  31. }
  32. let animal = new Animal("动物", 0);
  33. let dog = new Dog("旺财", 4, 2);
  34. console.log(Dog.kind);
  35. console.log(Dog.sayKind());
  36. dog.say();
  37. console.log(dog.value);
  38. dog.value = "white";
  39. console.log(dog.value);

装饰器

装饰器的作用:

  • 扩展类中的属性或方法
  • 扩展类的功能

    装饰器只能修饰类、类的属性、类的方法,三种

装饰器修饰类

  1. // 装饰器收集时,从上往下
  2. // 装饰器的执行顺序,先执行say3,再执行say2,最后执行say1
  3. function say1(val) {
  4. console.log(val);
  5. return function (target: string) {
  6. console.log("say1");
  7. };
  8. }
  9. function say2(val) {
  10. console.log(val);
  11. return function (target: string) {
  12. console.log("say2");
  13. };
  14. }
  15. function say3(val) {
  16. console.log(val);
  17. return function (target: string) {
  18. console.log("say3");
  19. };
  20. }
  21. @say1(1)
  22. @say2(2)
  23. @say3(3)
  24. class Person {}
  25. // 1 2 3 say3 say2 say1

装饰器修饰属性

可以对属性或静态属性进行修饰,类似vue2中的指令

  1. // target是类的原型,key是修饰的属性
  2. function toUpperCase(target: any, key: string) {
  3. let val: string = "";
  4. Object.defineProperty(target, key, {
  5. get() {
  6. return val.toUpperCase();
  7. },
  8. set(newVal) {
  9. val = newVal;
  10. },
  11. });
  12. }
  13. // 修饰静态属性,此时target为类本身
  14. function double(num:number){
  15. return function (target: any, key: string) { // target表示的类
  16. let val = target[key]
  17. Object.defineProperty(target, key, {
  18. get(){
  19. return num * val
  20. }
  21. })
  22. }
  23. }
  24. class Person {
  25. @toUpperCase
  26. public name: string = 'world';
  27. @double(2)
  28. static age: number = 18; //定义的静态属性,通过类调用
  29. }
  30. let p = new Person()
  31. console.log(p.name, Person.age) //WORLD

装饰器修饰方法

  1. function isEnumMember(flag: boolean){
  2. return function (target: any, key: string, descriptor: PropertyDescriptor){
  3. // 表示是否可被枚举
  4. descriptor.enumerable = flag
  5. }
  6. }
  7. class Person {
  8. @isEnumMember(false)
  9. getMoney(){}
  10. }

装饰器修饰参数

  1. function params(target:any, key: string, index: number){
  2. console.log(key, index);
  3. }
  4. class Person {
  5. run(@params time: string){}
  6. }