2012-03-29 60 views
1

在Node.js應用程序中從服務器端JavaScript切換到CoffeeScript後,我遇到了一個問題。讓我們看看下面的代碼:在使用CoffeeScript時使用util.inherits()「打破」原型設計

# require our tools 
util = require "util" 
events = require "events" 

# define an object class and a method using CoffeeScript syntax 
class TestObject 
    method:() -> #1 
    console.log "Test" 

# set up inheritance using Node.js util module 
util.inherits TestObject, events.EventEmitter #2 

# make an instance of object 
instance = new TestObject() 

# and boom! it crashes ;(
instance.method() 

上面的代碼會崩潰,因爲錯誤的:TypeError: Object #<TestObject> has no method 'method'

錯誤是由在#2建立繼承引起的。上面的代碼編譯爲以下JavaScript(刪除了可讀性的緣故一些新行):

(function() { 
    var TestObject, events, instance, util; 

    util = require("util"); 
    events = require("events"); 

    TestObject = (function() { 
    function TestObject() {} 

    TestObject.prototype.method = function() { 
     return console.log("Test"); 
    }; 

    return TestObject; 
    })(); 

    util.inherits(TestObject, events.EventEmitter); 

    instance = new TestObject(); 
    instance.method(); 

}).call(this); 

你可以看到util.inherits()方法也加入到原型方法之後調用。所以,切換原型後該方法會丟失。

有沒有一種優雅的方式來設置繼承而不破壞真棒CoffeeScript類表示法?

回答

2
class TestObject extends events.EventEmitter 
    method:() -> #1 
    console.log "Test" 

Is there an elegant way to set up the inheritance without breaking the awesome CoffeeScript class notation?

你可以只無法使用的CoffeeScript和使用對象

var extend = /* implement extend [snip] */ 

var TestObject = extend({}, events.EventEmitter.prototype, { 
    method: function() { 
     console.log("test") 
    } 
}) 

順便說一句,除非你真的很喜歡CoffeeScript的語法,你應該堅持的JavaScript。特別是對於圖書館來說,在CoffeeScript中編寫開源庫的人應該被擊中。

+0

媽的,它有時真的很有趣,當你意識到你已經忘記了最簡單,最優雅的方式。謝謝。 – Przemek 2012-03-29 10:12:18

+0

我在CoffeeScript中編寫了一個IRC bot,純粹是爲了好玩,並在過程中學習新東西,所以不要擔心;)。 – Przemek 2012-03-29 10:17:01

+1

「在CoffeeScript中編寫開源庫的人應該被拍攝。」 – jergason 2013-03-12 19:14:05

4

您還可以使用CoffeeScript的語法繼承,「擴展」:

util = require "util" 
events = require "events" 

class TestObject extends events.EventEmitter 
    method:() -> #1 
    console.log "Test" 

instance = new TestObject() 
instance.method() 
+4

恕我直言,遠遠更好的答案,並保留咖啡腳本約束。 – JeanLaurent 2013-05-04 18:55:47