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属性,指向创建该对象的构造函数
  • 相关阅读:
    Digital Square(hdu4394)搜索
    Substrings(hdu1238)字符串匹配
    Graveyard(poj3154)
    数据库的范式理论
    模和除
    You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
    对vector等STL标准容器进行排序操作(转!)
    0 or 1(hdu2608)数学题
    LintCode 4.丑数
    LintCode 9.Fizz Buzz问题
  • 原文地址:https://www.cnblogs.com/yxkNotes/p/13936706.html
Copyright © 2011-2022 走看看