類的一大應用就是多態。多態是一個面向對象編程的高級術語----「一個東西可編程不少不一樣的東西,但不是任何東西」。[引自coffeescript深刻淺出]javascript
class Shape constructor: (@width) -> computeArea: -> throw new Error 'I am an abstract class!' class Square extends Shape computeArea: -> Math.pow @width, 2 class Circle extends Shape radius: -> @width / 2 computeArea: -> Math.PI * Math.pow @radius, 2 showArea = (shape) -> unless shape instanceof Shape throw new Error 'showArea requires a Shape instance!' console.log shape.computeArea() showArea new Square(2) #4 showArea new Circle(2) #pi
生成的javascriptjava
// Generated by CoffeeScript 1.10.0 var Circle, Shape, Square, showArea, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; Shape = (function() { function Shape(width) { this.width = width; } Shape.prototype.computeArea = function() { throw new Error('I am an abstract class!'); }; return Shape; })(); Square = (function(superClass) { extend(Square, superClass); function Square() { return Square.__super__.constructor.apply(this, arguments); } Square.prototype.computeArea = function() { return Math.pow(this.width, 2); }; return Square; })(Shape); Circle = (function(superClass) { extend(Circle, superClass); function Circle() { return Circle.__super__.constructor.apply(this, arguments); } Circle.prototype.radius = function() { return this.width / 2; }; Circle.prototype.computeArea = function() { return Math.PI * Math.pow(this.radius, 2); }; return Circle; })(Shape); showArea = function(shape) { if (!(shape instanceof Shape)) { throw new Error('showArea requires a Shape instance!'); } return console.log(shape.computeArea()); }; showArea(new Square(2)); showArea(new Circle(2));