核心要点
JavaScript 没有传统的类系统,而是使用原型。原型非常灵活且功能强大,但对于初学者来说很令人困惑。因此,CoffeeScript 创建了一个传统的类系统。但是……它是如何做到的呢?CoffeeScript 的口号是“它只是 JavaScript”,而 JavaScript 明显缺少传统的类系统。在本文中,我们将介绍创建 CoffeeScript 类的基础知识。在下一篇文章中,我们将深入研究生成的 JavaScript(相对高级),以了解其背后的魔力。
父类
我们将主要通过示例进行讲解,因为对于那些阅读过我的 CoffeeScript 入门文章的人来说,应该很容易理解正在发生的事情。
<code class="language-coffeescript">class Bourgeoisie constructor: (@age, @privilegeConstant) -> worry: -> console.log("我的股票下跌了 1%!") profit: (hardWork, luck) -> return (@age - 23) * hardWork * (luck + @privilegeConstant) elite = new Bourgeoisie(29, 397) elite.worry() # "我的股票下跌了 1%!" elite.profit(20, 50) # 53640</code>
我们声明了一个名为 Bourgeoisie 的类。类的函数声明如下:
<code class="language-coffeescript">functionName: (arguments) -> code</code>
构造函数命名为 constructor。它接受两个参数,age 和 privilegeConstant,并自动将它们赋值为实例变量(@ 是 CoffeeScript 中 this 的替代,在构造函数的参数中使用时会自动将变量赋值给实例)。当您创建一个新的 Bourgeoisie 时,构造函数会自动调用,就像代码示例底部一样。我们还有另外两个函数。第一个函数 worry 不接受任何参数。第二个函数 profit 接受两个参数并返回一个数字。
继承类
现在,我们想要一个继承自 Bourgeoisie 的类。我们将其命名为 Senator。
<code class="language-coffeescript">class Senator extends Bourgeoisie worry: -> console.log("民调下跌了 1%!") senator = new Senator(45, 992) senator.worry() # "民调下跌了 1%!" senator.profit(6, 10) # 132264</code>
这个类扩展了 Bourgeoisie,这意味着它具有父类的所有特性。构造函数和 profit 函数完全相同,唯一的区别是构造实例时,您调用的是 Senator 而不是 Bourgeoisie。另一方面,worry 函数有所不同。Senator 比股票更担心民调,因此他的 worry 覆盖了父类的 worry。在下面显示的 Student 类中,再次可以看到这种覆盖。
<code class="language-coffeescript">class Bourgeoisie constructor: (@age, @privilegeConstant) -> worry: -> console.log("我的股票下跌了 1%!") profit: (hardWork, luck) -> return (@age - 23) * hardWork * (luck + @privilegeConstant) elite = new Bourgeoisie(29, 397) elite.worry() # "我的股票下跌了 1%!" elite.profit(20, 50) # 53640</code>
学生的 worry 覆盖了父类的 worry(比 Senator 的方式更戏剧化),他们的 profit 也被覆盖了。但是,覆盖现在取决于父类的 profit 函数。它采用该函数并减去学费。对学生来说,这是个艰难的时期!但你真正应该从中学到的是 super 关键字,它调用父类的函数版本。
但是,我喜欢原型
很好!CoffeeScript 为您提供便利,但它仍然为您提供强大的功能。让我们使用它!这是我们上次的简略示例:
<code class="language-coffeescript">functionName: (arguments) -> code</code>
这应该看起来很熟悉,因为 90% 的更改是将一些函数替换为尖箭头。原型继承系统保持不变,因为请记住,CoffeeScript 只是 JavaScript。语法更简洁,如果您想以我们上次使用的 Brendan Eich 风格实现原型,则无需学习更多内容。这并不是说 CoffeeScript 没有应用一些快捷方式。您可以使用 :: 代替 prototype。但是,在 Brendan Eich 风格的原型中,我们只需要在 object(o) 方法中使用一次。我们还可以访问 extends 和 super 关键字,但这些关键字仅在构造函数中使用——我们再次将其隐藏在 object(o) 方法中。
结论
CoffeeScript 中的经典继承系统为普通开发人员提供了便利和舒适。此外,CoffeeScript 更简洁的语法使得实现真正的原型系统更容易一些。总之,只有好处没有坏处。
关于 CoffeeScript 类的常见问题
CoffeeScript 中的类是一个基本概念,有助于组织和构建代码。它们提供了一种创建具有特定属性和方法的对象的方法。类使创建复杂的数据结构更容易,并提供了一种将数据和功能封装在一个地方的方法。它们还支持继承,允许您创建一个继承自现有类的新的类。这可以大大减少代码重复并提高代码的可维护性。
在 CoffeeScript 中定义类很简单。您使用 class 关键字后跟类名。例如,class MyClass。然后,您可以使用 @ 符号引用类的实例来在类中定义属性和方法。例如,@myProperty 将定义类的属性,而 @myMethod: -> 将定义方法。
CoffeeScript 中的继承是使用 extends 关键字实现的。当您定义一个类时,您可以指定它扩展另一个类。这意味着新类将继承它扩展的类的所有属性和方法。例如,class MySubClass extends MyClass 将创建一个继承自 MyClass 的新类。
是的,您可以在 CoffeeScript 的子类中覆盖方法。当您在子类中定义与超类中方法同名的一个方法时,将使用子类的方法。如果您仍然想调用超类的方法,可以使用 super 关键字。
要在 CoffeeScript 中创建类的实例,您可以使用 new 关键字后跟类名。例如,myInstance = new MyClass 将创建 MyClass 的一个新实例。
CoffeeScript 类中的构造函数方法是一个特殊的方法,当创建类的新的实例时会被调用。它通常用于初始化类的属性。在 CoffeeScript 中,构造函数方法是使用 constructor 关键字定义的。
CoffeeScript 不内置支持私有属性和方法。但是,您可以通过使用闭包或在构造函数方法中定义属性和方法来实现类似的效果,这使得它们只能在类的实例内访问。
要在 CoffeeScript 中调用类实例上的方法,您可以使用 . 运算符后跟方法名。例如,myInstance.myMethod() 将调用 myInstance 对象上的 myMethod 方法。
是的,您可以在 CoffeeScript 中定义类之后向类添加属性和方法。您可以通过在类的原型上定义它们来实现。例如,MyClass::myNewMethod = -> 将向 MyClass 添加一个新方法。
要在 CoffeeScript 中检查类实例的类型,您可以使用 instanceof 运算符。例如,myInstance instanceof MyClass 如果 myInstance 是 MyClass 的实例,则返回 true。
以上是咖啡网中的课的详细内容。更多信息请关注PHP中文网其他相关文章!