使用util.inherits()在使用CoffeeScript时“打破”原型

从Node.js应用程序中的服务器端JavaScript切换到CoffeeScript后,我遇到了一个问题。 我们来考虑下面的代码:

# 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设置inheritance引起的。 上面的代码编译为下面的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()方法在将该方法添加到原型之后调用。 所以,切换原型之后,该方法将会丢失。

有没有一个优雅的方式来build立inheritance而不破坏真棒CoffeeScript类符号?

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

有没有一个优雅的方式来build立inheritance而不破坏真棒CoffeeScript类符号?

你可以不使用coffeescript和使用对象

 var extend = /* implement extend [snip] */ var TestObject = extend({}, events.EventEmitter.prototype, { method: function () { console.log("test") } }) 

另外,除非你真的喜欢CoffeeScript语法,否则应该坚持使用JavaScript。 特别是对于图书馆来说,在CoffeeScript中编写开源库的人应该被击毙。

您也可以使用CoffeeScript语法来进行inheritance,“扩展”:

 util = require "util" events = require "events" class TestObject extends events.EventEmitter method: () -> #1 console.log "Test" instance = new TestObject() instance.method()