前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6语法中类(class)的实现原理

ES6语法中类(class)的实现原理

原创
作者头像
伯爵
修改2019-10-12 10:41:20
2K0
修改2019-10-12 10:41:20
举报
文章被收录于专栏:前端小菜鸟

JavaScript语言不同于其他的类C语言,没有提供类的概念,但是可以提供类似的语法糖来实现JS面向对象的编程范式,本质上不是严格意义上的类

我们创建一个Person对象,包含两个属性name,age和一个普通的方法run()和静态方法say()。

ES6 class
代码语言:txt
复制
class Person {
     constructor(name, age) {
    	this.name = name;
      	this.age = age;
    }
  
    static run() {
      console.log("run")
    }
    say() {
    	console.log("hello!")
    }
}

Person.run();

通过 static 关键字定义静态方法,静态方法只能通过类本身去调用,不能通过实例来调用。

ES6构造函数
代码语言:txt
复制
var Person = function () {
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.run = function run() {
        console.log("run");
    };

    var _proto = Person.prototype;

    _proto.say = function say() {
        console.log("hello!");
    };
    return Person;
}();
ES5原理
代码语言:txt
复制
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 Person = function () {
  function Person(name, age) {
    if(!(this instanceof Person)) {
        throw new TypeError("Cannot call a class as a function")
    }
    this.name = name;
    this.age = age;
  }

  _createClass(Person, [{
    key: "say",
    value: function say() {
      console.log("hello!");
    }
  }], [{
    key: "run",
    value: function run() {
      console.log("run");
    }
  }]);

  return Person;
}();
  • constructor我们直接声明Person函数对象,并完成属性name和age的绑定
  • this instanceof Person :我们判断构造函数是否是通过new操作符调用

这里我们参考了bable.js的转义代码:_createClass和_defineProperties两个函数。

_createClass(Constructor, protoProps, staticProps)

  • Constructor:需要设置属性的对象
  • protoProps:直接绑定在对象上的属性或者方法
  • staticProps:绑定在原型链上的属性和方法
  • protoProps和staticProps都是数组

_defineProperties(target, props)

  • target:需要定于属性的对象或者对象的prototype属性
  • props:对象需要设置属性列表
参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ES6 class
  • ES6构造函数
  • ES5原理
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档