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