Skip to content

一、将class转换为function

js
    class Example {
        constructor(name) {
            this.name = name
        }
        
        func() {
            console.log(this.name)
        }
    }

题解:

  • [60分答案]

    js
      function Example(name) {
          this.name = name
      }
      Example.prototype.func = function () {
          console.log(this.name)
      }
  • [70分答案]- 在es6里面使用类语法的话,整个里面的代码是在一个严格模式下边,所以要转换成普通函数构造函数,需要在第一行写上use strict

    js
      'use strict'
    
      function Example(name) {
          this.name = name
      }
      Example.prototype.func = function () {
          console.log(this.name)
      }
  • [80分答案]- 在es6里面,这个类虽然本质上是一个函数,但是这个函数有个特点,只能通过new来调用,不可直接调用,如果直接调用应该报Class constructor Example cannot be invoked without 'new'

    js
      'use strict'
    
      function Example(name) {
          // 验证 this 指向
          if(!(this instanceof Example)) {
             throw new TypeError(`Class constructor Example cannot be invoked without 'new'`);
          }
          this.name = name;
      }
      Example.prototype.func = function () {
          console.log(this.name)
      }
  • [90分答案]- 在在es6里面,这个类的方法是在原型上的,这是没有问题的,但是这个方法成员是不可被枚举的。

    js
      'use strict'
    
      function Example(name) {
          // 验证 this 指向
          if(!(this instanceof Example)) {
             throw new TypeError(`Class constructor Example cannot be invoked without 'new'`);
          }
          this.name = name;
      }
      Object.defineProperty(Example.prototype, 'func', {
          value: function () {
              console.log(this.name);
          },
          enumrable: false
      })
  • [100分答案]- 在es6里面,这个类的方法本身不能被new,会报e.func is not a constructor,但是在js里面任何函数都是可以被new

    js
    'use strict'
    
    function Example(name) {
        // 验证 this 指向
        if(!(this instanceof Example)) {
           throw new TypeError(`Class constructor Example cannot be invoked without 'new'`)
        }
        this.name = name
    }
    Object.defineProperty(Example.prototype, 'func', {
        value: function () {
            // 不可通过 new 调用
            if(!(this instanceof Example)) {
                throw new TypeError(`e.func is not a constructor`);
            }
            console.log(this.name);
        },
        enumrable: false
    })

Released under the MIT License.