1. <i id='Hv8Td'><tr id='Hv8Td'><dt id='Hv8Td'><q id='Hv8Td'><span id='Hv8Td'><b id='Hv8Td'><form id='Hv8Td'><ins id='Hv8Td'></ins><ul id='Hv8Td'></ul><sub id='Hv8Td'></sub></form><legend id='Hv8Td'></legend><bdo id='Hv8Td'><pre id='Hv8Td'><center id='Hv8Td'></center></pre></bdo></b><th id='Hv8Td'></th></span></q></dt></tr></i><div id='Hv8Td'><tfoot id='Hv8Td'></tfoot><dl id='Hv8Td'><fieldset id='Hv8Td'></fieldset></dl></div>
      <tfoot id='Hv8Td'></tfoot>

      <small id='Hv8Td'></small><noframes id='Hv8Td'>

      • <bdo id='Hv8Td'></bdo><ul id='Hv8Td'></ul>
      <legend id='Hv8Td'><style id='Hv8Td'><dir id='Hv8Td'><q id='Hv8Td'></q></dir></style></legend>

      CoffeeScript 中的动态类生成

      时间:2024-04-19

      1. <tfoot id='dKVMc'></tfoot>
          <bdo id='dKVMc'></bdo><ul id='dKVMc'></ul>
            <i id='dKVMc'><tr id='dKVMc'><dt id='dKVMc'><q id='dKVMc'><span id='dKVMc'><b id='dKVMc'><form id='dKVMc'><ins id='dKVMc'></ins><ul id='dKVMc'></ul><sub id='dKVMc'></sub></form><legend id='dKVMc'></legend><bdo id='dKVMc'><pre id='dKVMc'><center id='dKVMc'></center></pre></bdo></b><th id='dKVMc'></th></span></q></dt></tr></i><div id='dKVMc'><tfoot id='dKVMc'></tfoot><dl id='dKVMc'><fieldset id='dKVMc'></fieldset></dl></div>

            <small id='dKVMc'></small><noframes id='dKVMc'>

                  <tbody id='dKVMc'></tbody>

                <legend id='dKVMc'><style id='dKVMc'><dir id='dKVMc'><q id='dKVMc'></q></dir></style></legend>
              1. 本文介绍了CoffeeScript 中的动态类生成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

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

                What is the best way to dynamically create classes in CoffeeScript, in order to later instantiate objects of them?

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

                I have found ways to do it, but I am not sure if there is maybe an even better (or simpler) way to achieve it. Please let me know your thoughts on my code.

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

                Let's start with simple non-dynamic classes:

                class Animal
                  constructor: (@name) ->
                
                  speak: ->
                    alert "#{@name} says #{@sound}"
                
                class Cat extends Animal
                  constructor: (@name) ->
                    @sound = "meow!"
                
                garfield = new Cat "garfield"
                garfield.speak()
                

                果然,加菲猫喵喵叫!

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

                But now we want to dynamically generate classes for more animals, which are defined as follows:

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

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

                The first naive attempt fails:

                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 中我们知道了一种行之有效的方法来解决这个问题:闭包:

                The animal we just created, mutant, should be a mouse. However, it says roar! This is because animal.sound only gets evaluated when we instantiate the class. Luckily, from JavaScript we know a proven way to solve this: a closure:

                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()
                

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

                Now it works as desired, mickey mouse says eek! and simba the lion says roar! But it looks somewhat complicated already. I am wondering if there is an easier way to achieve this result, maybe by accessing the prototype directly. Or am I completely on the wrong track?

                推荐答案

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

                Since sound is a default value for an Animal instance, you can set it as a property on class definition:

                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 可以被覆盖,你可以这样做

                If you want sound to be overridable, you can do

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

                这篇关于CoffeeScript 中的动态类生成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:检查用户是否阻止了 3rd 方域 下一篇:Javascript代码执行顺序异常

                相关文章

                <small id='YjqWn'></small><noframes id='YjqWn'>

              2. <tfoot id='YjqWn'></tfoot>
                  • <bdo id='YjqWn'></bdo><ul id='YjqWn'></ul>

                    <i id='YjqWn'><tr id='YjqWn'><dt id='YjqWn'><q id='YjqWn'><span id='YjqWn'><b id='YjqWn'><form id='YjqWn'><ins id='YjqWn'></ins><ul id='YjqWn'></ul><sub id='YjqWn'></sub></form><legend id='YjqWn'></legend><bdo id='YjqWn'><pre id='YjqWn'><center id='YjqWn'></center></pre></bdo></b><th id='YjqWn'></th></span></q></dt></tr></i><div id='YjqWn'><tfoot id='YjqWn'></tfoot><dl id='YjqWn'><fieldset id='YjqWn'></fieldset></dl></div>

                    <legend id='YjqWn'><style id='YjqWn'><dir id='YjqWn'><q id='YjqWn'></q></dir></style></legend>