我在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
处的继承设置引起的。上面的代码编译为以下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类表示法?
答案 0 :(得分:4)
您还可以使用CoffeeScript语法进行继承,“extends”:
util = require "util"
events = require "events"
class TestObject extends events.EventEmitter
method: () -> #1
console.log "Test"
instance = new TestObject()
instance.method()
答案 1 :(得分:2)
class TestObject extends events.EventEmitter
method: () -> #1
console.log "Test"
有没有一种优雅的方法来设置继承而不会破坏真棒的CoffeeScript类表示法?
你不能使用coffeescript并使用对象
var extend = /* implement extend [snip] */
var TestObject = extend({}, events.EventEmitter.prototype, {
method: function () {
console.log("test")
}
})
顺便说一下,除非你真的喜欢CoffeeScript语法,否则你应该坚持使用JavaScript。特别是对于图书馆来说,在CoffeeScript中编写开源库的人应该被拍摄。