zoukankan      html  css  js  c++  java
  • ES5中的类相关/Typescript的类相关

    ES5相关类的代码演示

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        
    </head>
    <body>
        <div id="app">
            Box
        </div>
    </body>
    <script>
        //1、 es5 中的类的书写,其实类似于一个方法, 最简单的类,只有属性没有方法
        function Person() {
            this.name = "张三";
            this.age = 20;
        }
    
        var p = new Person();
        console.log(p.name);
    
        //2、构造函数和原型链中添加方法
        function Person_1() {
            this.name = "张三";  // 属性
            this.age = 20;
            this.run = function(){  // 实例方法,必须通过new的对象才能调用
                alert(this.name+"runing");
            }
        }
        var p = new Person_1();
        p.run();
    
        //3、通过类的原型链来添加方法和属性
        Person.prototype.sex ="male"; // 添加属性
        Person.prototype.work = function(){
            alert(this.name+'在原型链上添加方法')
        }
        var p_1 = new Person();
        p_1.work();
        // 注意原型链上的属性和方法会被多个实例共享,但是构造函数不会
    
        //4、 类的静态方法,上面的run、work都是实例方法,必须new后才调用
        Person.getInfo = function() {
            alert("我是类的静态方法")
        }
        Person.getInfo();  // 直接调用类的静态方法
        Person.xxxx = "类静态属性";  // 类静态属性
        console.log(Person.xxxx);
    
        //5、 es5 的类继承,定义个web类继承Person:原型链+对象冒充组合继承模式
        function Web(){
    
            Person_1.call(this);  // 对象冒充实现继承
        }
    
        Person_1.prototype.work = function() {
            alert("person——1 work")
        }
    
        var w = new Web();
        w.run(); // 继承了Person_1的方法,可以继承构造函数的属性和方法
        //w.work(); // 这里会报错,对象冒充能继承构造函数的属性和方法,但是无法实现原型链上的方法和属性
    
        //6、原型链上实现继承
        function Web_1() {
    
        }
        Web_1.prototype = new Person_1();  // 通过原型链挂载类实现继承
        var w = new Web_1();
        w.run(); // 继承了Person_1的方法,可以继承构造函数的属性和方法
        w.work(); // 没问题
    
        //7、 原型链实现继承的问题
        function Person_2(name,age) {
            this.name = name;  // 属性
            this.age = age;
            this.run = function(){  // 实例方法,必须通过new的对象才能调用
                alert(this.name+"runing");
            }
        }
        Person_2.prototype.sex ="male"; // 添加属性
        Person_2.prototype.work = function(){
            alert(this.name+'在工作')
        }
        var p = new Person_2('lisi',33);
        p.run();
        p.work();
    
        // 以上都可以实现,因为我们传入了名字和年纪,也就是说原型链继承在实例化时无法给父类传参
        function Web_2(name,age) {
    
        }
        Web_2.prototype = new Person_2(); // 但是我们通过原型链来实现继承就不能实时的控制name、age
        var p_2 = new Web_2('王五',45)
        p_2.run();  // undefiuned running 这里就不行了
    
        //8、原型链+构造函数结合实现继承
        function Web_3(name,age){
            // 这里也就是说将web类的name,age 给了父类Perons_2的构造函数this.name=name...
            Person_2.call(this,name,age); // 对象冒充继承,实例化子类可以给父类传参,    
        }
        Web_3.prototype = new Person_2();
        // Web_3.prototype = Person_2.prototype // 这样写也是可以的,效果一样
        var w = new Web_3('赵四',22);
        w.run();
        w.work();
    </script>
    </html>
    

      

    Typescript中的类相关

    这里我们在创建一个index.ts文件,同时创建一个html文件,其中导入index.js文件,然后大致的index.ts文件:

    /* es5 中定义类
    function Person(name){
        this.name = name;
        this.run = function(){
            console.log(this.name)
        }
    }
    */ 
    
    //1、 ts中的类定义,demo1
    class Person {
        name:string;  // 定义类属性,前面省略了public关键字
        constructor(n:string){  // 构造函数,实例化类的时候触发的方法
            this.name = n;
        }
        run():void{
            alert(this.name)
        }
    }
    // 实例化类
    var p = new Person('张三')  // 自动触发constructor构造函数,将n赋值给this.name,这个name就是类的共有变量
    p.run();
    
    // ts中的类定义:demo2
    class Person_1 {
        name:string;  // 定义类属性,前面省略了public关键字
        constructor(name:string){  // 构造函数,实例化类的时候触发的方法
            this.name = name;
        }
        getName():string{
          return this.name;  
        }
        setName(name:string):void{
            this.name = name
        }
    }
    
    // 实例化类
    var p1 = new Person_1('李四');  // 自动触发constructor构造函数,将n赋值给this.name,这个name就是类的共有变量
    alert(p1.getName());
    p1.setName('王麻子');
    alert(p1.getName());
    
    
    //2、 ts中实现继承,extends、super
    class Person_2{
        name:string;
        constructor(name:string){
            this.name = name;
        }
        run():string{
            return `${this.name}在跑步`
        }
        work():string{
            return `${this.name}在工作`
        }
    }
    
    // var p3 = new Person_2("王五")
    // alert(p3.run())
    
    class Web extends Person_2 {  // 通过extends表示继承哪个类,当传入参数时先执行本身的构造函数
        constructor(name:string){
            super(name)    // 进入到构造函数后,执行父类的构造函数,传入name参数
        }
        work():string{
            return `${this.name}在工作(子)`
        }
    }
    
    var w = new Web("刘七");
    alert(w.run());  // 继承了父类的方法,当然自己子类也可以扩展自己的方法
    
    // 父类和子类的方法一致时的问题,当子类和父类重名方法时,先调用子类的方法
    alert(w.work());
    
    
    //3、类中的修饰符,类里面的修饰符,ts中定义属性的时候为我们提供了三种修饰符:
    /*
        public(公有,类里面、子类、类外面都可以方法),属性默认都是public;
        protected(保护类型,在类里面、子类里面可以访问);
        private (私有、在类里面可以访问,子类、类外都不可以访问);
    */
    
    class Person_3 { 
        public name:string;  // 公有属性
        protected p_name:string;  // 保护属性
        private p_x:string;   // 自能在父类中使用
        constructor(name:string){  // 构造函数,实例化类的时候触发的方法
            this.name = name;
            this.p_name = name
            this.p_x = name
        }
    }
    
    class Web1 extends Person_3 {  // 通过extends表示继承哪个类,当传入参数时先执行本身的构造函数
        constructor(name:string){
            super(name)    // 进入到构造函数后,执行父类的构造函数,传入name参数
        }
        work():string{
            return `${this.p_name}在工作(子)`  // 可以访问
        }
    }
    var p4 = new Person_3('xxxx')
    console.log(p4.name) // 外部访问public
    //console.log(p4.p_name) // 外部不能访问protected属性
    var w1 = new Web1('ojbk')
    console.log(w1.work());
    

      

    Typescript类中的静态属性/方法,抽象类和多态

    /* es5中的静态方法
    function Person() {
        this.run1 = function() {}  // 实例方法,必须实例化才能调用
    }
    Person.run2 = function(){} // 静态方法,直接通过类调用
    
    // jquery 中底层实现案例
    function $(element){
        return new Base(element)
     }
    
     // Base对象
     function Base(element) {
         this.element = "获取到dom节点";
         this.css = function(arr, value){
             this.element.style.arr = value
         }
     }
    */
    
    //1、ts中定义静态方法
    class Person {
        public name:string;
        static sex = 'male';
        constructor(name:string){
            this.name = name;
        }
        run(){
            alert(`${this.name}在运动`)
        }
        work(){
            alert(`${this.name}在工作`)
        }
        static print() {   // 静态方法没法直接调用类里面的属性,除非时静态属性
            alert("print function " + Person.sex)  // 只能调用静态属性
        }
    }
     
    var p = new Person('张三四')  
    p.run(); // 实例方法
    Person.print(); // 静态方法
    
    
    //2、 ts中的多态,多态属于继承,其实就是父类有个方法是所有实例的表象,不同的实例有不同的实现风格,比如下面的所有动物
    //都吃东西,只不过每个动物各有所好
    class Animal {
        name:string;
        constructor(name:string){
            this.name=name
        }
        eat(){
            console.log('吃的方法')
        }
    }
    
    class Dog extends Animal {
        constructor(name:string){
            super(name)
        }
        eat(){
            return this.name +'吃肉'
        }
    }
    
    class Cat extends Animal{
        constructor(name:string){
            super(name)
        }
        eat(){
            return this.name +'吃鱼'
        }
    }
    
    // 3、 ts中的抽象类,ts中的抽象类,它是提供其他类继承的基类,不能直接实例化,就是一种约束实例的过程把
    // 用abstract关键字抽象类和抽象方法,这个关键字只能放在抽象类中
    
    //抽象类和抽象方法用来定义标准,如必须实现eat我才让你继承并实例,否则我不认你是我的子类
    abstract class Animal1 {
        public name:string;
        constructor(name:string){
            this.name = name
        }
        // 抽象方法只能出现在抽象类中
        abstract eat():any;
    }
    
    // var a = new Animal1()  // 无法实现抽象类,不能实例化
    class Dog1 extends Animal1 {
        constructor(name:string){
            super(name)
        }
    
        // 必须实现eat抽象方法
        eat(){
            console.log(this.name+'吃粮食')
        }
    }
    var d = new Dog1("xiaohei")
    d.eat();
    

      

  • 相关阅读:
    【学习笔记】查看CUDA版本
    如果Visual Studio太大,不妨还是用VSCode开发C#项目吧
    Visual Studio npm配置淘宝镜像
    c++读写锁--读者写者问题
    c++内存对象模型--vs2017下的分析,32位
    android作业
    android连接数据库
    android第十周(增删改查)
    android-购物车
    android计算器
  • 原文地址:https://www.cnblogs.com/double-W/p/12870948.html
Copyright © 2011-2022 走看看