声明构造函数

脱去class的语法糖-1.png

属性声明及赋值

脱去class的语法糖-2.png

静态属性声明及赋值

脱去class的语法糖-3.png

原型方法及静态方法赋值

脱去class的语法糖-4.png

将属性和静态属性声明及赋值部分整理成函数

脱去class的语法糖-5.png

再来一个批量操作属性

脱去class的语法糖-6.png

将原型方法和静态方法也统一使用一个函数处理

脱去class的语法糖-7.png

增加一个错误机制

脱去class的语法糖-8.png

完整代码

  1. "use strict";
  2. /**
  3. * 当你使用构造函数(Parent)的 call 的时候
  4. * 判断你传的 实例对象 的原型链上是否存在此构造函数
  5. * 如果不存在则直接报错
  6. */
  7. function _classCallCheck(instance, Constructor) {
  8. if (!(instance instanceof Constructor)) {
  9. throw new TypeError("Cannot call a class as a function");
  10. }
  11. }
  12. function _defineProperties(target, props) {
  13. for (var i = 0; i < props.length; i++) {
  14. var descriptor = props[i];
  15. // 默认不可枚举
  16. descriptor.enumerable = descriptor.enumerable || false;
  17. // 默认是可配置的
  18. descriptor.configurable = true;
  19. // 当有属性已经赋值了 则为可写属性
  20. if ("value" in descriptor) descriptor.writable = true;
  21. Object.defineProperty(target, descriptor.key, descriptor);
  22. }
  23. }
  24. function _createClass(Constructor, protoProps, staticProps) {
  25. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  26. if (staticProps) _defineProperties(Constructor, staticProps);
  27. /**
  28. * 将 prototype 设置为不可重写性质
  29. * 防止直接重写 prototype
  30. *
  31. * Parent.prototype = {...}
  32. */
  33. Object.defineProperty(Constructor, "prototype", { writable: false });
  34. return Constructor;
  35. }
  36. function _defineProperty(obj, key, value) {
  37. if (key in obj) { // 判断对象上是否存在该属性
  38. // 如果存在就改变 变量值 且 变成 可枚举 可写 可配置属性
  39. Object.defineProperty(obj, key, {
  40. value: value,
  41. enumerable: true,
  42. configurable: true,
  43. writable: true
  44. });
  45. }
  46. // 如果不存在就直接赋值就好了
  47. else {
  48. obj[key] = value;
  49. }
  50. return obj;
  51. }
  52. var Parent = /*#__PURE__*/ (function () {
  53. function Parent() {
  54. _classCallCheck(this, Parent);
  55. _defineProperty(this, "valueA", void 0);
  56. _defineProperty(this, "valueB", "B");
  57. }
  58. _createClass(
  59. Parent,
  60. [
  61. {
  62. key: "func",
  63. value: function func() { }
  64. }
  65. ],
  66. [
  67. {
  68. key: "staticFunc",
  69. value: function staticFunc() { }
  70. }
  71. ]
  72. );
  73. return Parent;
  74. })();
  75. _defineProperty(Parent, "staticValueA", void 0);
  76. _defineProperty(Parent, "staticValueB", "B");