• Typescript中类的使用


    1. /*
    2. * 基类
    3. * */
    4. class Base{
    5. constructor(obj=null) {
    6. if (obj){
    7. console.log('子类调用,基类构造函数',obj.a,obj.b);
    8. }else{
    9. console.log('基类构造函数');
    10. }
    11. }
    12. toString(obj){
    13. let [a,b]=[obj.a,obj.b];
    14. console.log('子类调用:toString()===>',a,b);
    15. }
    16. }
    17. /*
    18. * 派生类,继承于Base
    19. * */
    20. class Framework extends Base{
    21. constructor({a=0,b=0}={}) {
    22. super({a,b});//向基类传入参数
    23. super.toString({a,b});//调用基类函数
    24. }
    25. //公有方法实现,默认下类的所有方法都是公有的
    26. getParentName(){
    27. }
    28. //类的私有方法实现
    29. _getParentName(){
    30. }
    31. }
    32. let base = new Base();//实例化基类
    33. let framework = new Framework({a:8,b:9});//实例化派生类
    34. //类实例是对象,类是函数
    35. console.log('类对象的数据类型:',typeof base,typeof framework,'类的数据类型',typeof Base,typeof Framework);
    36. console.log('类原型对象构造:',Framework.prototype.constructor,'类构造:',Framework.constructor);
    37. console.log('类的原型对象prototype的constructor指向类名:',Framework.prototype.constructor===Framework);//类的原型对象prototype的constructor指向类名
    38. console.log('类名:',Framework.name);
    39. console.log(framework.constructor===Framework.prototype.constructor);
    40. //通过类原型对象向类添加方法
    41. Base.prototype.Add = function (x,y) {
    42. return x+y;
    43. }
    44. console.log('调用添加到基类原型对象上的方法:',base.Add(1,2));//调用添加到基类原型对象上的方法
    45. console.log('派生类调用基类原型对象的方法:',framework.Add(5,6));//派生类调用基类原型对象的方法
    46. // @ts-ignore
    47. Base.prototype.test =()=> {
    48. console.log('test func');
    49. };
    50. console.log(Object.getOwnPropertyNames(Base.prototype));//取类所有方法名
    51. //使用Object.assign为类添加方法
    52. Object.assign(Base.prototype, {
    53. M1() {
    54. console.log('M1');
    55. },
    56. M2() {
    57. console.log('M2');
    58. },
    59. M3() {
    60. console.log('M3');
    61. }
    62. });
    63. //调用添加的方法
    64. base.M1();
    65. framework.M2();
    66. framework.M3();
    67. //注: 类内部定义的所有方法都是不可枚举的
    68. console.log(Object.keys(Base.prototype));//constructor,toString这两个方法都在类内部定义,所以Object.keys无法枚举
    69. //使用变量名定义类方法
    70. let method = 'Done';
    71. Object.assign( Base.prototype,{[method](){
    72. console.log('通过变量名定义的函数');
    73. }});
    74. console.log(Object.keys(Base.prototype));
    75. base.Done();//通过方法名调用
    76. Reflect.get(base,method)();//使用反射通过变量名调用
    77. framework.Done();
    78. console.log(Object.getOwnPropertyNames(Framework.prototype));
    79. console.log('取当前类的继承对象',Object.getPrototypeOf(framework));
    80. console.log('取当前类的继承对象的所有方法',Object.getPrototypeOf( Object.getPrototypeOf(framework)));
    81. //根据子类取得基类,并调用基类方法
    82. let p = Object.getPrototypeOf( Object.getPrototypeOf(framework))
    83. p.Done();
    84. console.log(Object.getOwnPropertyNames(p));
    85. console.log(Reflect.ownKeys(p));
    86. Reflect.get(p,method)();
    87. console.log('base对象原型',base.__proto__,'framework对象原型:',framework.__proto__);
    88. //通过表达式形式声明类
    89. const ExpClass = class Exp {//此处Exp为类的别名,作用域只限于类内部定义
    90. constructor() {
    91. console.log('构造时打印类名:',Exp.name);
    92. }
    93. getClassName(){
    94. console.log('调用getClassName打印类名:');
    95. return Exp.name;
    96. }
    97. }
    98. let exp = new ExpClass();
    99. console.log(exp.getClassName());
    100. //立即执行类
    101. let execClass = new class{
    102. constructor() {
    103. console.log('立即执行类');
    104. }
    105. }();
    106. //带参数的立即执行类
    107. let execClassWithParam = new class{
    108. constructor(param) {
    109. console.log('立即执行类,参数:',param);
    110. }
    111. }('RemoteDev');
    112. //注: 类不存在变量提升,必须先声明后再实例化

  • 相关阅读:
    C++:红黑树
    商店销售预测(回归&随机森林)
    【数据结构】栈、队列和数组
    第一届“龙信杯”电子数据取证竞赛Writeup
    肖sir___环境的讲解详情__002
    Design for failure常见的12种设计思想
    【Docker 基础教程】Mysql主从环境搭建
    阿里云EasyExcel读写excel表数据
    【LeetCode】【剑指offer】【栈的压入、弹出序列】
    遗传算法极限学习机GA-ELM回归预测及其MATLAB代码实现
  • 原文地址:https://blog.csdn.net/fittec/article/details/126021341