第119篇: JavaScript 类

javascript · 浏览次数 : 33

小编点评

**面向对象编程三大特征:** 1. **封装**:将客观事物封装成抽象的类,并类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2. **继承**:继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。 3. **多态**:体现为覆盖和重载,JS没有重载,有时子类并不想原封不动地继承父类的方法,而是想作一定的修改。

正文

好家伙,我们先来复习一下

 

关于Java,类的三大特征:

1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

2、继承,继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。

3、多态,体现为覆盖和重载,Js没有重载,有时子类并不想原封不动地继承父类的方法,而是想作一定的修改。

这时我们可以对方法进行重写,也就是方法覆盖

 

 

1.类的定义

先来试用一下

function functionPerson(){}
class classPerson{
}

console.log(functionPerson.prototype)
console.log(classPerson.prototype)

(猜猜看跑完什么结果?)

 

 

 

所以我们知道,虽然ECMAScript 6类表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的仍然是原型和构造函数的概念。

(还是原型链那一套)

 

 

2.类的构造函数

类可以包含构造函数方法、实例方法、获取函数、设置函数和静态类方法,但这些都不是必需的。

使用new操作符实例化Person的操作等于使用new调用其构造函数。

唯一可感知的不同之处就是,JavaScript解释器知道使用new和类意味着应该使用constructor函数进行实例化。

使用new调用类的构造函数会执行如下操作。

(1)在内存中创建一个新对象。

(2)这个新对象内部的[[Prototype]]指针被赋值为构造函数的prototype属性。

(3)构造函数内部的this被赋值为这个新对象(即this指向新对象)。

(4)执行构造函数内部的代码(给新对象添加属性)。

(5)如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

 

3.原型方法

类定义语法把在类块中定义的方法作为原型方法。

(例子跟下面的放一起了)

 

4.静态类方法

可以在类上定义静态方法。这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例。

与原型成员类似,静态成员每个类上只能有一个。

静态类成员在类定义中使用static关键字作为前缀。在静态成员中,this引用类自身。其他所有约定跟原型成员一样:

  class Person {
    constructor() {
      // 添加到this的所有内容都会存在于不同的实例上
      this.locate = () => console.log('instance', this);
    }
    // 定义在类的原型对象上
    locate() {
      console.log('prototype', this);
    }
    //定义在类本身上
    static locate(){
      console.log('class', this);
    }
  }
  let p = new Person();
  p.locate();                     // instance, Person {}
  Person.prototype.locate();   // prototype, {constructor: ... }
  Person.locate();               // class, class Person {}

 

(书中原例,)

 

 

 

 

5.继承extend

类继承使用的是新语法,但背后依旧使用的是原型链。

使用extends关键字,就可以继承任何拥有[[Construct]]和原型的对象。

很大程度上,这意味着不仅可以继承一个类,也可以继承普通的构造函数(保持向后兼容)

class Person {}
function Cat() {}
class Somebody extends Person {}
class Bosicat extends Cat {}

let a = new Somebody();
let b = new Bosicat();
console.log(a instanceof Person);
console.log(b instanceof Cat);

 

 

 

 

(通过继承function这点看出,Js终于洗清了他的嫌疑,它确实和Java没关系)

 

 

6.super关键字

派生类的方法可以通过super关键字引用它们的原型。

这个关键字只能在派生类中使用,而且仅限于类构造函数、实例方法和静态方法内部。

在类构造函数中使用super可以调用父类构造函数。

class Cat{
    constructor(){
        this.age = '2'
    }
}

class Bosicat extends Cat{
    constructor(){
        super();
        console.log(this);
    }
}

new Bosicat;

 

 

 

 

 

在使用super时要注意几个问题。

(1)super只能在派生类构造函数和静态方法中使用。

(2)不能单独引用super关键字,要么用它调用构造函数,要么用它引用静态方法

(3)调用super()会调用父类构造函数,并将返回的实例赋值给this。

(4)super()的行为如同调用构造函数,如果需要给父类构造函数传参,则需要手动传入。

(5)如果没有定义类构造函数,在实例化派生类时会调用super(),而且会传入所有传给派生类的参数

(6)在类构造函数中,不能在调用super()之前引用this

(7)如果在派生类中显式定义了构造函数,则要么必须在其中调用super(),要么必须在其中返回一个对象。

 

与第119篇: JavaScript 类相似的内容:

第119篇: JavaScript 类

好家伙,我们先来复习一下 关于Java,类的三大特征: 1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2、继承,继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。 3、多态,体现为覆盖和重载,Js没有重载,有

第一百零五篇:变量的原始值和引用值

好家伙,JS基础接着学, 本篇内容为《JS高级程序设计》第四章学习笔记 1.原始值和引用值 ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。 在把一个值赋给变

第一百零六篇:变量的不同声明(var,let和const的不同)

JS关于变量的声明,变量提升,暂时性死区

第一百零七篇:基本数据类型(undefined,null,boolean类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Number, String和Symbol。 Symbol (符号)是ECMAScript6新增的。还有一种复杂数据类型

第一百零八篇:最常用的基本数据类型(Number类型)

最常用的基本数据类型(Number类型)

第一百一十篇:内存泄漏和垃圾回收(JS)

好家伙,本篇内容为《JS高级程序设计》第四章的学习笔记 1.内存泄露 1.1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其

第一百一十一篇:基本引用类型Date

好家伙,本篇为《JS高级程序设计》第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像极了“类”) 经常被人错误的称作“类”。 虽然从技术上讲JavaScript是一门面向对象语言,但是ECMAScri

第一百一十二篇: JS数组Array(一)数组基本用法

好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。 跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据, 但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。 这意味着可以创建一个数组,它的第

第一百一十四篇: JS数组Array(三)数组常用方法

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill()。 这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。 使用这个方法不会改变数组的大小。 1.1.fi

第一百一十五篇: JS集合引用类型Map

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.Map ECMAScript6以前,在JavaScript中实现“键/值”式存储可以使用object来方便高效地完成,也就是使用对象属性作为键,再使用属性来引用值。 但这种实现并非没有问题,为此TC39委员会专门为“键/值”存储定