zoukankan      html  css  js  c++  java
  • Es6-Class与继承

    1.传统方式定义类

    function Point1(x,y){
      this.x = x
      this.y = y
    }
    Point1.prototype.add = function(){
      return this.x + this.y
    }
    var p1 = new Point1(3,9)
    console.log(p1.add())

    2.class方式定义一个类

    class Point2{
      constructor(x, y){
        this.x = x
        this.y = y
      }
      add(){  // 这里的add方法实际上是定义在原型上的。
        return this.x + this.y
      }
    }
    var p2 = new Point2(4,77)
    console.log(p2.add())

    3.类的数据类型就是函数,类本身就是指向函数的,类的所有方法都是定义在类的prototype上的

    class Point3{
      say(){
        // 
      }
      eat(){
        // 
      }
    }
    // 等同于以下
    Point3.prototype.say = function(){
      // 
    }
    Point3.prototype.eat = function(){
      // 
    }
    // 等同于:
    Point3.prototype = {
      say(){}, 
      eat(){},
    }

      所以:在类上调用方法,实际上是在原型上调用方法。

    4.constructor方法

      constructor方法是类的默认方法。new生成实例时,会默认调用constructor方法

      一个类必须有constructor方法,如果没有显式的声明,就会自动创建一个空的constructor方法

    class Con{
    
    }
    // 等同于
    class Con{
      constructor(){
        // 
      }
    }
    // JavaScript引擎会自动给Con类添加一个constructor方法, 这个方法默认会返回实例对象(this)

    5.类的静态方法

       类是实例的原型,所有类的方法都会被实例继承。但是,如果在一个方法前面加上static关键字,就代表这是一个静态方法,这个静态方法不会被实例继承,而是通过类直接调用

       静态方法可以与非静态方法可以重名

    6.Class继承

       class的继承是通过extends关键字实现的   基本语法-------class Dog extends Animal{}

       这里的Cat类,通过extends关键字,继承了Animal类所有的属性和方法,因为没有代码,所以相当于复制了一份

    class Animal{
      constructor(name, age){
        this.name = name
        this.age = age
      }
      sayName(){
        return "it's name is " + this.name
      }
    }
    class Cat extends Animal{
      constructor(name, age, color){
        super(name, age)  // super关键字调用父元素的方法
        this.color = color
      }
      sayColor(){
        return "the color is " + this.color
      }
    }
    var bosimiao = new Cat("bosi", 2, 'yellow')
    console.log(bosimiao.sayName()) // it's name is bosi
    console.log(bosimiao.sayColor())  // the color is yellow

      关于super关键字:
        1、在子构造函数中,必须用super方法,否则新建对象的时候会报错
        2、子构造函数中,使用this前必须先用super,否则会报错

      ES6的继承机制:先创建父类的实例对象,再创建子类的实例,然后修改父类的this

    7.Class原型链的方式继承

    我们每创建一个函数,都有一个prototype属性(自带的),这个prototype属性是一个指针,指向了一个对象,这个对象是原型对象。
    
    这个原型对象上有一个constructor属性。这个constructor属性是一个指针,指向了构造函数。
    
    构造函数的new出来的实例对象,有一个__proto__属性(内部属性),这个属性指向原型对象。
    
    所以实例也能访问原型对象的属性和方法。
    原型对象通过constructor指针指向了构造函数
    
    所有的构造函数也是Function的实例
    所有构造函数的原型对象是Object的实例
    
    所以,实例,构造函数,原型对象的关系是:
    [].__proto__ === Array.prototype === 原型对象
    [].__proto__.constructor === Array
    Animal.prototype.constructor === Animal
    
    prototype:每个函数都有显式原型prototype
    __proto__:每个对象实例都有隐式原型__proto__
    constructor:构造函数的原型有一个constructor属性,指向创建该对象的构造函数
  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/yxkNotes/p/13936706.html
Copyright © 2011-2022 走看看