Open gnosis23 opened 6 years ago
创建基础类
var _createClass = (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);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})();
以下两件事:
注意拷贝的方式为 Object.defineProperty
,并且默认是不能枚举 ( enumerable ) 和可修改的 ( configurable ) 。
我们的代码如下
class Rectangle extends Polygon {
constructor(height, width) {
super(height, width);
this.name = 'Rectangle';
}
sayName() {
ChromeSamples.log('Sup! My name is ', this.name + '.');
super.sayHistory();
}
}
被转化成了下面代码
var Rectangle = (function(_Polygon) {
_inherits(Rectangle, _Polygon);
function Rectangle(height, width) {
_classCallCheck(this, Rectangle);
var _this = _possibleConstructorReturn(
this,
(Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call(
this,
height,
width
)
);
_this.name = "Rectangle";
return _this;
}
_createClass(Rectangle, [
{
key: "sayName",
value: function sayName() {
ChromeSamples.log("Sup! My name is ", this.name + ".");
_get(
Rectangle.prototype.__proto__ ||
Object.getPrototypeOf(Rectangle.prototype),
"sayHistory",
this
).call(this);
}
}
]);
return Rectangle;
})(Polygon);
我们发现 super 好像被翻译成了 (Rectangle.proto || Object.getPrototypeOf(Rectangle))
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError(
"Super expression must either be null or a function, not " +
typeof superClass
);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass)
Object.setPrototypeOf
? Object.setPrototypeOf(subClass, superClass)
: (subClass.__proto__ = superClass);
}
注意两点:
借用一副图来描述子类和父类之间的关系
// var _this = _possibleConstructorReturn(
// this,
// (Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call(
// this,
// height,
// width
// )
// );
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError(
"this hasn't been initialised - super() hasn't been called"
);
}
return call && (typeof call === "object" || typeof call === "function")
? call
: self;
}
构造函数有返回值的时候返回,否则返回 this。
// super.sayHistory();
// _get(
// Rectangle.prototype.__proto__ ||
// Object.getPrototypeOf(Rectangle.prototype),
// "sayHistory",
// this
// ).call(this);
var _get = function get(object, property, receiver) {
if (object === null) object = Function.prototype; // ??? 1
var desc = Object.getOwnPropertyDescriptor(object, property);
if (desc === undefined) {
var parent = Object.getPrototypeOf(object);
if (parent === null) {
return undefined;
} else {
return get(parent, property, receiver);
}
} else if ("value" in desc) {
return desc.value;
} else {
var getter = desc.get;
if (getter === undefined) {
return undefined;
}
return getter.call(receiver); // ??? 2
}
};
Babel.js 如何转化 class
Basic Class
源代码来自
Chrome Samples
。上面的代码会被转译成: