扩展类并将所有构造函数参数传递给super

Aco*_*orn 10 class coffeescript

你如何使用CoffeeScript扩展一个类,但是将构造参数传递给super?

例如:

class List extends Array
    # Some other stuff to make it work...

list = new List(1,2,3)

console.log list
Run Code Online (Sandbox Code Playgroud)
[1, 2, 3]

Tre*_*ham 24

通常,这可以在没有附加代码的情况下工作; 除非明确覆盖,否则使用父构造函数:

class A
  constructor: ->
    console.log arg for arg in arguments

class B extends A

new B('foo') # output: 'foo'
Run Code Online (Sandbox Code Playgroud)

问题不在于Array没有constructor方法:

coffee> Array.constructor
[Function: Function]
Run Code Online (Sandbox Code Playgroud)

问题就是这Array简单.虽然数组原则上只是"对象",但实际上它们的存储方式不同.因此,当您尝试将该构造函数应用于不是数组的对象时(即使它通过了instanceof Array测试),它也不起作用.

所以,你可以使用Acorn的解决方案,但是你可能会遇到其他问题(特别是如果你传递的List东西需要一个真正的数组).出于这个原因,我建议实现List作为数组实例的包装器,而不是尝试使用本机对象类型的继承.

当我们讨论这个主题时,一个非常重要的澄清:当你单独使用时super,它确实通过了所有的论点!这种行为来自Ruby.所以

class B extends A
  constructor: ->
    super
Run Code Online (Sandbox Code Playgroud)

将所有参数传递给A构造函数,而

class B extends A
  constructor: ->
    super()
Run Code Online (Sandbox Code Playgroud)

将调用没有参数A的构造函数.


jej*_*s0n 8

class List extends Array
    constructor: ->
        @push arguments...

    toString: ->
        @join('-')
Run Code Online (Sandbox Code Playgroud)
list = new List(1, 2)

list.push(3)

list.toString()
Run Code Online (Sandbox Code Playgroud)

=>

'1-2-3'