Использование util.inherits () «ломает» прототипирование при использовании CoffeeScript - PullRequest
1 голос
/ 29 марта 2012

Я столкнулся с проблемой после переключения с серверного 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?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2012

Вы также можете использовать синтаксис CoffeeScript для наследования «extends»:

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

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

instance = new TestObject()
instance.method()
2 голосов
/ 29 марта 2012
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, заслуживают того, чтобы их застрелили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...