"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var MyClass = function MyClass() {
_classCallCheck(this, MyClass);
};
configurable: 为true时,a.可删除该属性; b. 可配置除描述符的writable属性之外的属性,如enumerable、get、set、value等
writable:为true时,才可通过赋值改变定义属性的值,否则只读
enumerable:当为true时,才可通过for ... in ,Object.keys获取到定义的属性。
get\set,当读取一个属性或给一个属性赋值时,get/set会自动执行。很多现代js框架数据和dom绑定的核心原理。
引子
正文
先写一个最简单的空类
源码
babel编译
分析
定义一个类,实际上定义了一个函数,只是比普通函数多了一个实例检查,判断该实例是否是通过构造函数创建的。一般我们创建一个类的实例使用new MyClass()关键字。
定义一个类的方法
源码
定义一个doAction方法
babel编译
分析
定义一个类的静态方法
源码
babel编译
解释
我们可以在_createClass函数中发现:
普通方法和静态方法唯一的区别在于:方法是定一个在了构造函数的原型上还是构造函数本身。 我们知道。我们调用一个类的普通方法时,我们需要实例化。而调用静态方法时,可直接用类名直接引用调用。如MyClass.doStaticAction()
定义一个类的属性和静态属性
源码
babel编译
解释
是不是发现了什么不一样的东东。 为什么方法和静态方法通过Object.defineProperty定义的,而属性和静态属性不一样了? 为什么没有把prop属性定义到构造函数的prototype上? 为什么没有通过Object.defineProperty将staticProp定义到构造函数constructor上? 如果采用和定义方法同样的方法Object.deifneProperty定义属性和静态属性会发生什么?
要解答这些问题,其实我们可以从《Javascript权威指南》中找到答案:
理解了上面三个对象,上面的问题自然迎刃而解。
写一个空类继承MyClass
源码
babel编译
解释
从上面可以看到,引入了继承,一切看起来不再那么简单。 不过总体来说,子类继承父类做了两个工作:
下面主要研究这两个函数具体是怎么做的? 当然还有一个很明显的问题,为什么父类在构造函数里不需要返回,而子类构造函数需要返回? 下面逐一分析。
说到这里,可能还是不太明白? 为了彻底搞明白继承这个事情,我们必须先了解下面几个问题:
待续?
这些我们可以另开文章注意研究讨论。
其实这个问题我们还可以继续讨论,如: 如果给子类添加新的属性或新的方法,是如何编译的? 如果有一个孙子类继承子类,又是如何编译,和父类MyClass的关系又如何?
总结
上面我们可以说基本上都是以研究的思路一点一点逐步加深的思路去做的? 我会在另一篇文章里以总结的思路去重新梳理这篇文章? 比如: