Я столкнулся с проблемой после переключения с серверного JavaScript на CoffeeScript в приложении Node.js.Давайте рассмотрим следующий код:
# 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?