gpt4 book ai didi

javascript - CoffeeScript 中的动态类生成

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:02 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com