User
類被編譯之後轉化爲構造函數。被編譯後生成了_classCallCheck
,_instanceof
方法。javascript
class User{
}
const user = new User();
console.log(user); // {}
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
"use strict";
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");
}
}
var User = function User() {
_classCallCheck(this, User);
};
var user = new User();
console.log(user); // {}
複製代碼
User
類有name、age、address
三個屬性,name、age
屬性採用Object.defineProperty
的方式定義屬性。 雖然與address
賦值方式不同,可是最終的效果是一致的。java
注意:name、age不是定義在原型上的屬性 實例屬性新寫法es6
class User{
name = "jason";
age = 18;
constructor(){
this.address = "shanxi";
}
}
const user = new User();
console.log(user); //{ name: 'jason', age: 18, address: 'shanxi' }
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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 User = function User() {
_classCallCheck(this, User);
_defineProperty(this, "name", "jason");
_defineProperty(this, "age", 18);
this.address = "shanxi";
};
複製代碼
如下代碼省略了_defineProperty
,_classCallCheck
,_instanceof
等公用的方法。函數
sayName
函數在構造函數的原型上 調用了_defineProperties(Constructor.prototype, protoProps);
ui
class User{
name = "jason";
sayName(){
console.log(this.name);
}
}
const user = new User();
user.sayName()
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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;
}
var User =
(function() {
function User() {
_classCallCheck(this, User);
_defineProperty(this, "name", "jason");
}
_createClass(User, [
{
key: "sayName",
value: function sayName() {
console.log(this.name);
}
}
]);
return User;
})();
var user = new User();
user.sayName()
複製代碼
箭頭函數在編譯後對this作了綁定this
class User{
name = "jason";
sayName = () => {
console.log(this.name);
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
var User = function User() {
var _this = this;
_classCallCheck(this, User);
_defineProperty(this, "name", "jason");
_defineProperty(this, "sayName", function() {
console.log(_this.name);
});
};
複製代碼
靜態屬性做爲構造函數的一個屬性存在spa
class User{
static name = "jason";
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
var User = function User() {
_classCallCheck(this, User);
};
//省略_defineProperty方法源碼
//靜態屬性 被編譯後 第一個參數是User,而普通屬性則是this
_defineProperty(User, "name", "jason");
複製代碼
靜態方法sayName
做爲構造函數的一個屬性存在prototype
class User {
name = "jason"
static sayName() {
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑ ES6 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓ ES5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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;
}
var User =
/*#__PURE__*/
function () {
function User() {
_classCallCheck(this, User);
_defineProperty(this, "name", "jason");
}
//靜態函數編譯後,第二個參數設置爲null
_createClass(User, null, [{
key: "sayName",
value: function sayName() {}
}]);
return User;
}();
複製代碼