函数

  • 函数的关键点:参数、返回值、函数的作用、函数在什么地方调用
  • es5 定义的函数
  1. function fn() {}
  2. const fn1 = function() {}
  • ts 定义的函数
  1. function fn():void {}
  2. const fn1 = function():void {}
  • 函数传参
  1. function fn(name:string, age:number):string {
  2. // console.log('我是 void ');
  3. return `${name}-${age}`;
  4. }
  5. // console.log('我是 void ');
  6. // const fn1 = function(name, age):void {}
  7. console.log(fn('胡图图', 18));
  • 可传参数(age?:number)
  1. function fn(name:string, age?:number):string {
  2. // console.log('我是 void ');
  3. return `${name}-${age}`;
  4. }
  5. // console.log('我是 void ');
  6. // const fn1 = function(name, age):void {}
  7. console.log(fn('胡图图'));
  • 默认参数
  1. // age = 18
  2. function fn(name:string, age:number = 18, ...reset:any):string {
  3. console.log(reset);
  4. // console.log('我是 void ');
  5. return `${name}-${age}`;
  6. }
  7. // console.log('我是 void ');
  8. // const fn1 = function(name, age):void {}
  9. console.log(fn('胡图图'));
  10. // console.log(fn('胡图图', 18, [1, 2, 3]));
  • 剩余参数
  1. // reset
  2. function fn(name:string, ...reset:any):string {
  3. console.log(reset);
  4. // console.log('我是 void ');
  5. return `${name}-${reset}`;
  6. }
  7. // console.log('我是 void ');
  8. // const fn1 = function(name, age):void {}
  9. // console.log(fn('胡图图'));
  10. console.log(fn('胡图图', 18, [1, 2, 3]));
  • 重载
  1. function fn(msg: number): number;
  2. function fn(msg: string): string;
  3. function fn(msg: boolean): boolean;
  4. function fn(msg: any): any { // 具体的执行函数,
  5. if(typeof msg == 'string') {
  6. return msg.split('').reverse().join('');
  7. } else if(typeof msg == 'number') {
  8. return Number(String(msg).split('').reverse().join(''));
  9. } else {
  10. return '错误';
  11. }
  12. }
  13. // 注意,function pickCard(x): any并不是重载列表的一部分,因此这里只有两个重载:一个是接收对象另一个接收数字。 以其它参数调用 pickCard会产生错误。
  14. console.log(fn(123));
  15. console.log(fn('abc'));

  • 继承

    • 组合继承 对象冒充+原型链

      • 对象冒充,只能继承构造函数里面的属性和方法。不能够继承到原型上的。 ```javascript // 类的三大特性: 封装 继承 多态 // 在 es5 中函数首字母大写,我们称之为这是一个构造函数 function Person() { this.name = ‘张三’; this.age = 18;

      this.say = function() { console.log(this.name + ‘说’); } }

    // 原型 Person.prototype.eat = function() { console.log(‘我的名字是’ + this.name); }

    // call改变 this 指向 bind, apply // 这三个什么区别 // bind 默认执行 // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样 // 子类 function Son() { // 使用 call 进行继承 Person.call(this); // 对象冒充 }

    // 实例话一个子类 const s = new Son(); s.say(); // 张三说 s.eat(); // eat is a function

    1. - 原型继承
    2. ```javascript
    3. // 类的三大特性: 封装 继承 多态
    4. // 在 es5 中函数首字母大写,我们称之为这是一个构造函数
    5. function Person() {
    6. this.name = '张三';
    7. this.age = 18;
    8. this.say = function() {
    9. console.log(this.name + '说');
    10. }
    11. }
    12. // 原型
    13. Person.prototype.eat = function() {
    14. console.log('我的名字是' + this.name);
    15. }
    16. // call改变 this 指向 bind, apply
    17. // 这三个什么区别
    18. // bind 默认执行
    19. // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样
    20. // 子类
    21. function Son() {
    22. // 使用 call 进行继承
    23. Person.call(this); // 对象冒充
    24. }
    25. // 原型继承
    26. Son.prototype = new Person();
    27. // 实例话一个子类
    28. const s = new Son();
    29. s.say(); // 张三说
    30. s.eat(); // 我的名字是张三
  • 静态属性和方法

    • 静态方法,在构造函数后面直接添加,调用的时候,构造函数可以直接调用。 ```javascript // 类的三大特性: 封装 继承 多态 // 在 es5 中函数首字母大写,我们称之为这是一个构造函数 function Person() { this.name = ‘张三’; this.age = 18;

      this.say = function() { console.log(this.name + ‘说’); } }

    // 原型 Person.prototype.eat = function() { console.log(‘我的名字是’ + this.name); }

    // call改变 this 指向 bind, apply // 这三个什么区别 // bind 默认执行 // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样 // 子类 function Son() { // 使用 call 进行继承 Person.call(this); // 对象冒充 }

    // 原型继承 Son.prototype = new Person();

    // 实例话一个子类 const s = new Son(); s.say(); s.eat();

// 添加静态属性 s.sex = ‘男’; s.staticFn = function() { console.log(‘我是静态方法’); }

// 调用静态属性和方法 console.log(s.sex); s.staticFn();

  1. - es6的创建方式
  2. - es6类的继承方式
  3. ```javascript
  4. class Person{
  5. constructor(name, age) {
  6. // super(name, age); // 继承
  7. this.name = name;
  8. this.age = age;
  9. }
  10. say() {
  11. console.log(this.name+ '说');
  12. }
  13. eat() {
  14. console.log('我的名字是' + this.name);
  15. }
  16. }
  17. // const p = new Person();
  18. // p.say();
  19. // p.eat();
  20. // es6 的类如何实现继承
  21. class Son extends Person{
  22. constructor(name, age) {
  23. super(name, age);
  24. }
  25. }
  26. const s = new Son('张三', 18);
  27. s.say();
  28. s.eat();
  • ts 中类的继承和属性及方法的定义 ```javascript // es6 定义 类 的方式 class Person{ // name: string == this.name = name; name: string; age: number; constructor(name: string, age: number) { // super(name, age); // 继承

    // = 赋值曹植 this.name = name; this.age = age; }

    say(): void { console.log(this.name+ ‘说’); } eat(): void { console.log(‘我的名字是’ + this.name); } }

    // const p = new Person(); // p.say(); // p.eat();

// es6 的类如何实现继承 class Son extends Person{ constructor(name: string, age: number) { super(name, age); } }

const s = new Son(‘张三’, 18); s.say(); s.eat();

  1. <a name="fad060bd-1"></a>
  2. # 类
  3. - 类的 4 大修饰符
  4. - public(公共的)(在TypeScript里,成员都默认为 public。)
  5. ```php
  6. public say():void {
  7. console.log(this.name + '说');
  8. }
  • private(私有的)(当成员被标记成 private时,它就不能在声明它的类的外部访问。)
  1. private eat(): void {
  2. console.log(this.name + '吃');
  3. }
  • protected(protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问。例)
  1. protected go(): void {
  2. console.log(this.name + '走开了');
  3. }
  • readonly(只读的)(你可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。)
  1. readonly name: string;
  • static(静态属性)(到目前为止,我们只讨论了类的实例成员,那些仅当类被实例化的时候才会被初始化的属性。 我们也可以创建类的静态成员,这些属性存在于类本身上面而不是类的实例上。)
  1. class Grid {
  2. static origin = {x: 0, y: 0};
  3. calculateDistanceFromOrigin(point: {x: number; y: number;}) {
  4. // ...好多代码
  5. }
  6. constructor (public scale: number) { }
  7. }
  8. let grid1 = new Grid(1.0); // 1x scale
  9. let grid2 = new Grid(5.0); // 5x scale
  10. // 静态属性的调用
  11. console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
  12. console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));