重学ES6(二):ES5和ES6中Class类的相同与不同

ES5和ES6中Class类的相同与不同

先说结论,简而言之ES5用function定义类,ES6用class定义类,class的本质是function,ES6中的类只是语法糖,它并没有改变ES5下类实现的本质。

类的定义

ES5

// ES5函数来描写类
// 声明类
let Animal = function (type) {
  this.type = type
  // 定义实例方法
  this.drink = function () {
    console.log(‘drink‘)
  }
}

// 定义原型方法
Animal.prototype.eat = function () {
  console.log(‘eat food‘)
}

// 实例化
let dog = new Animal(‘dog‘)
let monkey = new Animal(‘monkey‘)

ES6

// ES6 class
// class的本质是ES5用原型链声明类的语法糖
class Animal {
  constructor (type) {
    this.type = type
  }
  eat () {
    console.log(‘eat food‘)
  }
}

let dog = new Animal(‘dog‘)
let monkey = new Animal(‘monkey‘)

ES6类中的set和get方法

  • set用于设置属性(无返回值)
  • get用于读取属性(有返回值)
let _age = 4
class Animal {
  constructor (type) {
    this.type = type
  }
  get age () {
    return _age
  }
  set age (val) {
    this.realage = val
  }
  eat () {
    console.log(‘eat food‘)
  }
}

let dog = new Animal(‘dog‘)
console.log(dog.age) // 4
dog.age = 5 // 未生效 get定义的为只读属性
console.log(dog.age) // 4
console.log(dog.realage) // 5

ES5类中的 实例方法&原型方法&静态方法

  • 实例方法只有实例可以调用

  • 实例方法可以调用静态方法,不能调用原型方法

  • 原型方法可以被实例和构造函数访问到

  • 原型方法只可以调用静态方法

  • 静态方法只有构造函数可以调用

ES5中定义三种方法及调用关系

let Animal = function (type) {
  this.type = type
  // 实例方法
  this.drink = function () {
    // 实例方法可调用类的静态方法
    Animal.walk()
    console.log(‘drink‘)
  }
}

// 原型方法
Animal.prototype.eat = function () {
  // 原型方法可调用类的静态方法
  Animal.walk()
  console.log(‘eat food‘)
}

// 静态方法
Animal.walk = function () {
  console.log(‘walking‘)
}

let dog = new Animal(‘dog‘)
dog.drink() // walking drink
dog.eat() // walking eat food
Animal.walk() // walking静态方法只能由<类自身&实例方法&原型方法>调用,实例对象无法调用
// dog.walk() // dog.walk is not a function  实例对象无法调用静态方法

ES6类中的 实例方法&原型方法&静态方法

  • 实例方法=原型方法 类中直接定义的实例方法默认就是ES5中的原型方法(语法糖)

  • 静态方法用static前缀定义

  • 静态方法只有构造函数可以调用,原型方法是实例和构造函数都可以调用,是共享的方法。

class Animal {
  constructor (type) {
    this.type = type
  }
  // 定义实例对象的方法
  eat () {
    // 使用静态方法,以类形式访问,而非this访问
    Animal.walk()
    console.log(‘eat food‘)
    console.log(this.type) // 类的例实例对象的方法可以获取到实例对象的信息,输出dog
  }
  // static 定义类的静态方法
  static walk () {
    console.log(‘walking‘)
    console.log(this.type) // 类的静态方法无法获取到实例对象的信息,输出undefined
  }
}
let dog = new Animal(‘dog‘)
dog.eat() // walking ; undefined ; eat food ; dog
Animal.walk() // walking ; undefined ;
dog.walk() // dog.walk is not a function
// 得出结论:需要访问实例对象的信息时用实例对象的方法,否则使用static静态方法
// 实例方法就是只有实例可以调用,静态方法只有构造函数可以调用,原型方法是实例和构造函数都可以调用,是共享的方法。

ES5 子类

  • .call方法指向父类

  • 设置原型链指向相同

let Animal = function (type) {
  this.type = type
  // 实例方法
  this.drink = function () {
    // 实例方法可调用类的静态方法
    Animal.walk()
    console.log(‘drink‘)
  }
}

// 原型方法
Animal.prototype.eat = function () {
  // 原型方法可调用类的静态方法
  Animal.walk()
  console.log(‘eat food‘)
}

// 静态方法
Animal.walk = function () {
  console.log(‘walking‘)
}

let Dog = function () {
  // 初始化父类的构造函数,call的作用是改变this指向dog的实例
  Animal.call(this, ‘dog‘)
  this.run = function () {
    console.log(‘run‘)
  }
}

// 两个原型链指向相同,子类才可以用父类的方法
Dog.prototype = Animal.prototype

let dog = new Animal(‘dog‘)
dog.eat()  // 实例对象能调用类定义在原型上的实例对象的方法
// dog.walk() // 实例对象不能调用类的静态方法

let realdog = new Dog(‘realdog‘)
realdog.eat()
realdog.run()

ES6 子类

  • extends定义子类,super指向父类的原型对象,可以调用父类的属性和方法。

class Animal {
  constructor (type, age) {
    this.type = type
    this.age = age
  }
  detail () {
    console.log(this.type + ‘ ‘ + this.age)
  }
}

class Dog extends Animal {
  // 定义子类的构造函数
  constructor (type, age, sex) {
    // super()要和父类的constructor一致
    // super关键字表示调用父类的构造方法,也就是父类constructor中的内容
    super(type, age)
    this.sex = sex
  }
  ndetail () {
    console.log(this.type + ‘ ‘ + this.age + ‘ ‘ + this.sex)
  }
}

// let cat = new Animal(‘cat‘, 20)
// cat.detail()
let dog = new Dog(‘dog‘, 5, ‘gong‘)
dog.ndetail()

原文地址:https://www.cnblogs.com/xzweb/p/12264101.html

时间: 2024-09-30 20:55:35

重学ES6(二):ES5和ES6中Class类的相同与不同的相关文章

重学计算机网络(二) - 曾记否,查IP地址

先献上几个梗 1.1.1.1 不是测试用的,原来一直没分配,现在被用来做一个DNS了,宣传是比谷歌等公司的dns服务 更保护用户隐私. IP地址255.255.255.255,代表有限广播,它的目标是网络中的所有主机. IP地址0.0.0.0,通常代表未知的源主机.当主机采用DHCP动态获取IP地址而无法获得合法IP地址时,会用IP地址0.0.0.0来表示源主机IP地址未知. NID不能以数字127开头.NID 127被保留给内部回送函数,作为本机循环测试使用. 例如,使用命令ping 127.

ES5和ES6那些你必须知道的事儿(二)

ES5和ES6那些你必须知道的事儿 ES5新增的东西 二.对象方法 1.Object.getPrototypeOf(object) 返回对象的原型 function Pasta(grain, width) { this.grain = grain; this.width = width; } var spaghetti = new Pasta("wheat", 0.2); var proto = Object.getPrototypeOf(spaghetti); console.log

ES5与ES6中的继承

ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' this.sleep = function () { // 实例方法 return this.name + '正在睡觉' } } Father.prototype.eat = funciton () { // 原型方法 return this.name + '正在吃饭' } 一,原型链继承核心:将父

ES5和ES6中的继承

看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: 1 function Super() {} 2 3 function Sub() {} 4 Sub.prototype = new Super(); 5 Sub.prototype.constructor = Sub; 6 7 var sub = new Sub(); 8 9 Sub.prototype.constructor

ES5和ES6中对于继承的实现方法

在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是通过将子类构造函数的原型作为父类构造函数的实例,这样就连通了子类-子类原型-父类,原型链的特点就是逐层查找,从子类开始一直往上直到所有对象的原型Object.prototype,找到属性方法之后就会停止查找,所以下层的属性方法会覆盖上层. 一个基本的基于原型链的继承过程大概是这样的: //先来个父类

ES5和ES6中的继承 图解

Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了class和extends,和ES5搅在一起,加上平时很少自己写继承,简直乱成一锅粥.不过还 好,画个图一下就清晰了,下面不说话了,直接上图,上代码. ES5 ES5中的继承,看图: 1 function Super() {} 2 3 function Sub() {} 4 Sub.prototype

重学ES6(一):数组及其新方法

数组的遍历 1.传统for循环 2.forEach方法,不支持break和continue const arr = [1, 2, 3, 4, 5] arr.forEach(function (item) { console.log(item) }) 3.every方法,可以做到 break 那样的效果,return false 等同于 break,return true 等同于 continue const arr = [1, 2, 3, 4, 5] // every 默认return fals

es6转es5

一.在没有IDE情况下的转换 在"我的电脑->D盘”新建个文件夹es6,文件夹里新建一个文件es6.js. 打开命令行窗口 1.先全局安装babel-cli,输入命令 npm install babel-cli -g 2.输入 cd d:\es6 ; ---进入文件夹路径 3.输入 npm init: 一路回车键 ---(引导你创建一个package.json文件,包括名称.版本.作者这些信息等) 4.输入 npm install --save-dev babel-cli: ---(安装命

JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)

写在前面的话 这是一个JavaScript面向对象系列的文章,本篇文章主要讲概述,介绍面向对象,后面计划还会有5篇文章,讲抽象.封装.继承.多态,最后再来一个综合. 说实话,写JavaScript面向对象的文章实在是太多了,网上一搜一大堆,很多书里面也介绍的很详细.但作者当初在学习面向对象的时候还是非常困难,特别是在习惯了面向过程编程的情况下,不知道大家有没有这个感受. 作者分析了一下其中的原因,恐怕是因为里面涉及的概念太多:原型.原型链.继承.this.constructor.call等等,这