javascript - CoffeeScript 中的动态类生成

标签 javascript oop closures coffeescript

在 CoffeeScript 中动态创建类以便稍后实例化它们的对象的最佳方法是什么?

我已经找到了实现它的方法,但我不确定是否有更好(或更简单)的方法来实现它。请让我知道您对我的代码的看法。

让我们从简单的非动态类开始:

class Animal
  constructor: (@name) ->

  speak: ->
    alert "#{@name} says #{@sound}"

class Cat extends Animal
  constructor: (@name) ->
    @sound = "meow!"

garfield = new Cat "garfield"
garfield.speak()

不出所料,加菲猫会喵喵叫!

但是现在我们要为更多的动物动态生成类,定义如下:

animalDefinitions = [
    kind:  'Mouse'
    sound: 'eek!'
  ,
    kind:  'Lion'
    sound: 'roar!'
  ]

第一次天真的尝试失败了:

for animal in animalDefinitions
  animal.class = class extends Animal
    constructor: (@name) ->
      @sound = animal.sound

mutant = new animalDefinitions[0].class "mutant"
mutant.speak()

我们刚刚创建的动物 mutant 应该是一只老鼠。但是,它说吼!这是因为 animal.sound 只有在我们实例化类时才会被评估。幸运的是,我们从 JavaScript 中知道了一种经过验证的解决方法:闭包:

for animal in animalDefinitions
  makeClass = (sound) ->
    class extends Animal
      constructor: (@name) ->
        @sound = sound
  animal.class = makeClass(animal.sound)

mickey = new animalDefinitions[0].class "mickey"
mickey.speak()

simba = new animalDefinitions[1].class "simba"
simba.speak()

现在它可以正常工作了,米老鼠说哎呀!狮子辛巴说吼!但它看起来已经有些复杂了。我想知道是否有更简单的方法来实现这个结果,也许是直接访问原型(prototype)。还是我完全走错了路?

最佳答案

由于 sound 是 Animal 实例的默认值,您可以将其设置为类定义的属性:

class Cat extends Animal
    sound: 'meow!'

garfield = new Cat "garfield"
garfield.speak() # "garfield says meow!"

然后

for animal in animalDefinitions
    animal.class = class extends Animal
        sound: animal.sound

mutant = new animalDefinitions[0].class "mutant"
mutant.speak() # "mutant says eek!"

如果你想让sound被覆盖,你可以这样做

class Animal
    constructor: (@name, sound) ->
        @sound = sound if sound? 
    speak: ->
        console.log "#{@name} says #{@sound}"

关于javascript - CoffeeScript 中的动态类生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523719/

相关文章:

javascript - Typescript 无法解析 json 文件?

c# - OOP - 从子函数更新整个对象,如 C 中的指针

c# - 测试接口(interface)是否支持某个方法并调用它的最佳实践是什么?

java - 如果一个类没有状态,所有的方法都应该是静态的吗?

快速完成 block

JavaScript 闭包问题又来了!

javascript - JQuery UI 将多组单选按钮转换为 slider

javascript - 将数据传递给 Jquery Ajax 的正确方法

javascript - Ext JS 6 中与预加载关系一对一

javascript - AngularJS - Uncaught ReferenceError : a is not defined