【问题标题】:StandardJs + ES6 extended class - Useless constructor? [duplicate]StandardJs + ES6 扩展类 - 无用的构造函数? [复制]
【发布时间】:2018-02-06 00:54:30
【问题描述】:

这是我的模型类:

'use strict'

import MongoDb from 'database/mongodb'

export default class Model {
  constructor (options) {
    this.data = this.sanitize(options)
  }

  objectId (_id) {
    // https://stackoverflow.com/questions/17545311/correct-way-to-search-for-mongodb-entries-by-id-in-node
    const mongodb = new MongoDb()
    const objectId = mongodb.objectId
    return objectId(_id)
  }

  async db () {
    const mongodb = new MongoDb()
    const connection = await mongodb.connect()
    return connection
  }

  sanitize (options) {
    return options
  }

  async insert (options) {
    //
  }

  async find (options) {
    //
  }

  async remove (options) {
    //
  }
}

我有一个从它扩展的用户类:

'use strict'

import lodash from 'lodash'
import Model from 'model'
import schemas from './schemas'

export default class User extends Model {
  constructor (options) {
    super(options)
  }

  sanitize (options) {
    let data = options || {}
    let schema = schemas.user
    let keys = lodash.keys(schema)
    let defaults = lodash.defaults(data, schema)
    let picked = lodash.pick(defaults, keys)    
    return picked
  }
  ...
  ...
}

但是根据standardjs

standard: Use JavaScript Standard Style (https://standardjs.com)
  /var/www/html/.../user/models/user.js:8:3: Useless constructor.

为什么我的constructorUseless

据我了解,我必须在我的扩展课程中使用super(),即使我还没有完全理解它。是不是我用错了?

有什么想法吗?

编辑:

如果我省略扩展类中的constructor,我会得到这个错误:

Syntax Error: missing super() call in constructor

【问题讨论】:

    标签: javascript class ecmascript-6 extends


    【解决方案1】:
      constructor (...args) {
        super(...args);
      }
    

    constructor 被省略时,将是扩展类中的默认构造函数。这就是为什么它被标记为“无用”。

    super只有在有constructor的情况下才应该在扩展类中指定,constructor只有在除了调用具有完全相同参数的父构造函数之外应该有一些逻辑时才应该指定。

    【讨论】:

    • here 是来自eslint 的评论,证实了这一点!
    • 换一种方式考虑,当扩展一个类时,你不会调用每个方法只是为了在其中调用 super。那么为什么要使用构造函数呢?这只是一种特殊的方法。
    • @DanielGimenez 我不会这样推断,因为构造函数真的很特别,它不仅仅是原型对象上的constructor 属性,它不像其他方法那样原型继承自父级。但是思路是正确的,类是构造函数的语法糖,被设计成不需要不必要的输入。
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2014-05-29
    • 2014-09-13
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多