Babel编译:类继承
编译前
// 父类
class Fruit {
static nutrition = "vitamin"
static plant() {
console.log('种果树');
}
name;
constructor(name) {
this.name = name;
}
hello() {
console.log(this.name);
}
} // 子类
class Mongo extends Fruit {
constructor(name, level) {
super(name);
this.level = level;
}
eat() {
console.log(super.name, this.name);
}
}
编译后
"use strict"; // 获取类型
function _typeof(obj) {
// 运行环境原生支持Symbol
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
_typeof = function _typeof(obj) {
return typeof obj;
};
}
// 模拟实现Symbol
else {
_typeof = function _typeof(obj) {
return obj &&
typeof Symbol === "function" &&
obj.constructor === Symbol &&
obj !== Symbol.prototype
? "symbol"
: typeof obj;
};
}
return _typeof(obj);
} /**
* 可能调用父类的构造函数,返回了创建的事物
* @param {Object} self - 上下文
* @param {Object} call - 调用父构造函数,创建的事务(对象/函数)
*/
function _possibleConstructorReturn(self, call) {
// 语法规则:构造函数通过new运算符调用时,只能返回对象/函数
if (call && (_typeof(call) === "object" || typeof call === "function")) {
return call;
}
return _assertThisInitialized(self);
} // 断言上下文已被初始化
function _assertThisInitialized(self) {
// 没有调用super初始化上下文,抛异常
if (self === void 0) {
throw new ReferenceError(
"this hasn't been initialised - super() hasn't been called"
);
}
return self;
} // 读取属性
function _get(target, property, receiver) {
// 支持Reflect
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get;
}
// 模拟Relect
else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(receiver);
}
return desc.value;
};
}
return _get(target, property, receiver || target);
} // 沿着原型链向上查找,直到找到最早拥有该属性的原型对象(即不是通过继承获得该属性)
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
} // 读取__proto__
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf
? Object.getPrototypeOf
: function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
} // 继承
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
// 继承成员方法:子构造函数的prototype,继承父构造函数的prototype
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: { value: subClass, writable: true, configurable: true }
});
// 继承静态属性、静态方法:子构造函数的__proto__,是父构造函数
if (superClass) _setPrototypeOf(subClass, superClass);
} // 设置__proto__
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
} function _instanceof(left, right) {
if (
right != null &&
typeof Symbol !== "undefined" &&
right[Symbol.hasInstance]
) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
} function _classCallCheck(instance, Constructor) {
if (!_instanceof(instance, Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
} function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
} function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
} function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
} var Fruit =
/*#__PURE__*/
(function () {
_createClass(Fruit, null, [
{
key: "plant",
value: function plant() {
console.log("种果树");
}
}
]); function Fruit(name) {
_classCallCheck(this, Fruit); _defineProperty(this, "name", void 0); this.name = name;
} _createClass(Fruit, [
{
key: "hello",
value: function hello() {
console.log(this.name);
}
}
]); return Fruit;
})(); _defineProperty(Fruit, "nutrition", "vitamin"); var Mongo =
/*#__PURE__*/
(function (_Fruit) {
_inherits(Mongo, _Fruit); function Mongo(name, level) {
var _this; _classCallCheck(this, Mongo); _this = _possibleConstructorReturn(
this,
_getPrototypeOf(Mongo).call(this, name)
);
_this.level = level;
return _this;
} _createClass(Mongo, [
{
key: "eat",
value: function eat() {
console.log(
_get(_getPrototypeOf(Mongo.prototype), "name", this),
this.name
);
}
}
]); return Mongo;
})(Fruit);
Babel编译:类继承的更多相关文章
- C++ 类继承的对象布局
C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- C++——类继承
类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作 ...
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- iOS学习——iOS 整体框架及类继承框架图
整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...
- 《C++ Primer Plus》读书笔记之十一—类继承
第十三章 类继承 1.类继承:扩展和修改类. 2.公有继承格式:冒号指出B类的基类是A,B是派生类. class B :public A { ... }: 3.派生类对象包含基类对象.使用公有派生,基 ...
- 接口和抽象类的使用场景以及多类继承存在的问题(c#)
我们首先来看下抽象class能发挥优势的使用场景. 假设有一个Cars基类,具体型号的Car继承该基类,并实现自己独有的属性或方法. public class Cars { public string ...
- java类继承总结一 父类类型与子类类型之间的转化问题(转)
java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...
随机推荐
- 用jmeter进行接口测试(2)
1.jmeter配置元件之HTTP信息头管理器使用 右击线程组-[添加]-[HTTP信息头管理器] 是打发 Jmeter请求元件之参数化txt
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
- VxWorks引导启动过程
https://blog.csdn.net/phunxm/article/details/6979089
- ZROI 19.08.02 计算几何
1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识 ...
- java<T>泛型
泛型 1.泛型的概述 在JDK1.5之前,把对象放入到集合中,集合不会记住元素的类型,取出时,全都变成Object类型.泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr ...
- Tomcat网站上的core和deployer的区别
8.5.13 Please see the README file for packaging information. It explains what every distribution(分布) ...
- C++ fstream 用法
#include <fstream> #include <iostream> main() { int a,b,c,d; std::ifstream infile (" ...
- 【NOIP2012模拟11.1】塔(加强)
题目 玩完骰子游戏之后,你已经不满足于骰子游戏了,你要玩更高级的游戏. 今天你瞄准了下述的好玩的游戏: 首先是主角:塔.你有N座塔一列排开.每座塔各自有高度,有可能相等. 这个游戏就不需要地图了. 你 ...
- spark2.1.0 自定义AccumulatorV2累加少值(线程不安全)?
一.踩坑经历 自定义的accumulator是线程不安全的,会造成累加结果不正确.自定找了很久没想到是线程不安全行成的. 二.解决方法 创建一个线程安全的集合变量(我用的是Java的Concurren ...
- 【leetcode】1230.Toss Strange Coins
题目如下: You have some coins. The i-th coin has a probability prob[i] of facing heads when tossed. Ret ...