使用util.inherits()在使用CoffeeScript时“中断”原型设计

时间:2012-03-29 10:06:23

标签: javascript node.js 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处的继承设置引起的。上面的代码编译为以下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 个答案:

答案 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中编写开源库的人应该被拍摄。

相关问题