-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Babel.js 如何转化 class #1
Labels
Comments
_createClass创建基础类 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;
};
})(); 以下两件事:
注意拷贝的方式为 继承类我们的代码如下 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)) _inheritsfunction _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);
} 注意两点:
借用一副图来描述子类和父类之间的关系 |
_possibleConstructorReturn// 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。 _get// 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
}
}; |
Open
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Babel.js 如何转化 class
Basic Class
源代码来自
Chrome Samples
。上面的代码会被转译成:
The text was updated successfully, but these errors were encountered: