当前位置: 首页 > news >正文

JavaScript高级程序设计(第四版)--学习记录之对象、类与面向对象编程(下)

ES6新引入class关键字具有正式定义类的能力。

类定义:类声明和类表达式。

// 类声明
class Person {} 
// 类表达式
const Animal = class {};

类定义与函数定义的不同:

                                                1:函数声明可以提升,类定义不能

                                                2:函数受函数作用域限制,类受块作用域限制

//提升与否
console.log(FunctionDeclaration); // FunctionDeclaration() {} 
function FunctionDeclaration() {} 
console.log(FunctionDeclaration); // FunctionDeclaration() {}
console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined 
class ClassDeclaration {} 
console.log(ClassDeclaration); // class ClassDeclaration {}
//作用域限制范围function FunctionDeclaration() {} class ClassDeclaration {} 
} 
console.log(FunctionDeclaration); // FunctionDeclaration() {} 
console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined

类构造函数:constructor关键字用于在类定义块内部创建类的构造函数。

实例化,使用new调用类的构造函数会执行如下操作:

(1) 在内存中创建一个新对象。
(2) 这个新对象内部的 [[Prototype]] 指针被赋值为构造函数的 prototype 属性。
(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
(4) 执行构造函数内部的代码(给新对象添加属性)。
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
class Animal {} 
class Person { constructor() { console.log('person ctor'); } 
} 
class Vegetable { constructor() { this.color = 'orange'; } 
} 
let a = new Animal(); 
let p = new Person(); // person ctor 
let v = new Vegetable(); 
console.log(v.color); // orange

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

class Vehicle {} 
// 继承类
class Bus extends Vehicle {} 
let b = new Bus(); 
console.log(b instanceof Bus); // true 
console.log(b instanceof Vehicle); // true 
function Person() {} 
// 继承普通构造函数
class Engineer extends Person {} 
let e = new Engineer(); 
console.log(e instanceof Engineer); // true 
console.log(e instanceof Person); // true

super():

class Vehicle { static identify() { console.log('vehicle'); } 
} 
class Bus extends Vehicle { static identify() { super.identify(); } 
} 
Bus.identify(); // vehicle

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

class Vehicle{
constructor() {
super();
//SyntaxError:'super' keyword unexpected}
}

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

class Vehicle {} 
class Bus extends Vehicle { constructor() { console.log(super); // SyntaxError: 'super' keyword unexpected here } 
}

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

class Vehicle {} 
class Bus extends Vehicle { constructor() { super(); console.log(this instanceof Vehicle); } 
} 
new Bus(); // true

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

class Vehicle { constructor(licensePlate) { this.licensePlate = licensePlate; } 
} 
class Bus extends Vehicle { constructor(licensePlate) { super(licensePlate); } 
} 
console.log(new Bus('1337H4X')); // Bus { licensePlate: '1337H4X' }

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

class Vehicle { constructor(licensePlate) { this.licensePlate = licensePlate; } 
} 
class Bus extends Vehicle {} 
console.log(new Bus('1337H4X')); // Bus { licensePlate: '1337H4X' }

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

class Vehicle {} 
class Bus extends Vehicle { constructor() { console.log(this); } 
} 
new Bus(); 
// ReferenceError: Must call super constructor in derived class 
// before accessing 'this' or returning from derived constructor

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

class Vehicle {} 
class Car extends Vehicle {} 
class Bus extends Vehicle { constructor() { super(); } 
} 
class Van extends Vehicle { constructor() { return {}; } 
} 
console.log(new Car()); // Car {} 
console.log(new Bus()); // Bus {} 
console.log(new Van()); // {}

http://www.lryc.cn/news/388275.html

相关文章:

  • PDF 生成(5)— 内容页支持由多页面组成
  • day 51 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
  • http包详解
  • Reqable实战系列:Flutter移动应用抓包调试教程
  • 乾元通渠道商中标吴忠市自然灾害应急能力提升项目
  • 护网蓝队面试
  • 【高考志愿】金融学
  • 返利App的用户行为分析与数据驱动决策
  • python基础:高级数据类型:集合
  • idk17配置
  • Java实现日志全链路追踪.精确到一次请求的全部流程
  • 你敢相信吗,AI绘画正在逐渐取代你的工作!
  • 博途PLC轴工艺对象随动误差监视功能
  • 《昇思25天学习打卡营第24天 | 昇思MindSporeResNet50图像分类》
  • 糟糕的管理者都有这几个特征
  • Python (Ansbile)脚本高效批量管理服务器和安全
  • 《数字图像处理与机器视觉》案例三 (基于数字图像处理的物料堆积角快速测量)
  • Postman接口测试工具的原理及应用详解(四)
  • 扛鼎中国AI搜索,天工凭什么?
  • 【Ant Design Vue的更新日志】
  • Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建
  • System.currentTimeMillis() JAVA 转C#
  • 人机交互新维度|硕博电子发布双编码器操作面板、无线操作面板等新品
  • 简单shell
  • Spring Boot + FreeMarker 实现动态Word文档导出
  • 3D生物打印的未来:多材料技术的突破
  • 充电宝口碑哪个好?好用充电宝品牌有哪些?好用充电宝推荐
  • Pytorch-----(6)
  • leetcode hot100 第三题:最长连续序列(Java)
  • 利用Jaspar进行转录因子结合位点预测