前端学习:构造函数,原型对象,类,成员变量,类的继承

1.构造函数:

通过new关键字实例化对象的函数就是构造函数,在定义构造函数时首字母要大写,用来构件对象。

  // new + 构造函数
  var array = new Array(1, 2, 3, 4, 5);

2.原型对象

如果把所有的方法全部定义在构造器中,新建对象中都会包含构造函数中的方法 会浪费内存

prototype  原型本身就是一个对象,    用来  :共享方法,节省内存

每一个构造函数都有一个原型对象

原型对象中的方法可以新建的实例对象直接调用,因为每一个对象中都拥有一个属性叫__proto__

而__proto__指向原型对象,实例化对象调用原型对象中的方法时可以省略__proto__

constructor 构造器就是看原型对象是由哪个构造器构建出来的,找到它的源头

给构造函数的原型对象赋值属性时,构造器的指向还是原来的构造函数,

Person.prototype.sayHi = function () {
            console.log(" hi ");
        }
        Person.prototype.play = function () {
            console.log(" play ");
        }

当给构造函数的原型对象赋值一个对象时,会改变原型对象的constructor指向,需要在对象里添加  constructor:构造函数名,让其指向原来的构造器

   // 改变了 Person.prototype.constructor的指向
        Person.prototype = {
            // 指向原来的构造器
            constructor: Person,
            sayHi: function () {
                console.log("say hi");
            },
            play() {
                console.log("打篮球");
            },
            toString(){
                console.log(123);
            }
        }

原型链:即成员查找机制    调用方法

                1.找自身构造函数,

                2.自身原型对象

                3.找父类的构造函数

                4,找父类的原型对象

                ...3,4步骤

                直到null     没有就报错

3.es6类

解决es5继承复杂的一种替代方式,   

                用class声明,类名首字母要大写,

                将属性存放在constructor构造器中,也就是初始化属性

                方法写构造器下面

然后通过new创建类的对象,创建出来的对象就可以用类的属性和方法

  // 解决 ES5 继承复杂的一种替代方式
        // class 类  类名首字母要大写  
        class Person {
            // constructor   构造器   初始化属性
            // 主要存放属性
            constructor(name,age){
                this.name = name;
                this.age = age;
            }
            play(){
                console.log("打篮球");
            }
            sayHi(){
                console.log("sayHi");
            }
        }
        // 创建类的对象
        var p1 =  new Person("ZHANGSAN",20);
        p1.play();
        console.log(" p1  = ",p1);

        var p2 =  new Person("LISI",10);
        console.log(" p2  = ",p2);
        p2.play();
        console.log(p1.__proto__ === p2.__proto__)
        console.log(p1.__proto__)

4.成员变量

          分为静态成员变量和实例成员变量  

静态(静态变量 和 静态方法)是被类名打点调用的

实例(实例变量 和 实例方法)是被对象打点调用的

       // 成员变量 
        // 静态的 (静态变量 和 静态方法)  都是被类名打点调用的
        // 实例的 (实例变量 和 实例方法)  都是被对象打点调用的  一般情况都是

        // Math.PI;
        // Math.random();
        class Person{
            constructor(name,age){
                this.name = name;
                this.age = age;
            }
            play(){
                console.log(" =====  ==== ");
            }
            //static 静态的
            static money = 20000;
            static sayHi(){
                console.log("静态方法  类名调用");
            }
        }

        var obj = new Person("张三",290);
        console.log(obj.name);
        console.log(obj.age);
        obj.play();

        // 公共的属性
        // 静态属性  类调用
        console.log(Person.money);

        // 静态方法 类调用
        Person.sayHi();

 5.类的继承 

面向对象编程:类的三大特性: 封装、继承、多态

多态:同一个事件根据不同的对象进行调用  满足三个条件:继承 重写 父类指针指向子类对象

继承:1.子类可以使用父类的属性和方法 2.并且拥有特有的属性和方法

通过class定义子类并通过extends关键字继承父类内容结构和类一样,将属性放在constructor构造器中,在访问this之前,需要调用super()函数来继承父类,还可以写自己特有的属性和方法,方法要继承父类的方法也要用super调要继承的方法,然后还可以叠加新功能

  // 面向对象编程语言  
        // 类的三大特性  1.封装  2.继承   3.多态
        // 多态  同一个事件根据不同的对象进行调用  满足三个条件1.继承  2.重写  3.父类的指针指向子类的对象 (了解)
        // 继承: 1子类可以使用父类的属性和方法  2 并且拥有特有的属性和方法 
        class Person {
            constructor(name,age){
                this.name = name;
                this.age = age;
            }
            play(){
                console.log("乒乓球  父类的方法")
            }
            static num = 0;
            static haHaHa(){
                console.log("父类的静态方法")
            }
        }

        // extends 继承 
        class Man extends Person {
            constructor(name,age,cool){
                // 在访问this之前必须调用super函数
                super(name,age);
                // 特有的属性
                this.cool = cool;
            }
            smoke(){
                console.log("抽烟 ---- ");
            }

            play(){
                // super 超级的 指的是父类的对象
                // 用super调用的好处是   保留了父类的功能  又叠加了新功能
                super.play();
                console.log("打篮球  ==== ");
            }
        }

        var man = new Man("张三",20,"cool");

        // 1.
        console.log(man.name);
        console.log(man.age);
        // man.play();

        console.log(Man.num)// 父类静态属性
        Man.haHaHa();
        // 2.
        console.log(man.cool);
        man.smoke();

        man.play();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值