1

node-binary二进制解析器使用以下模式构建其对象:

exports.parse = function parse (buffer) {
    var self = {...}
    self.tap = function (cb) {...};
    self.into = function (key, cb) {...};
    ...
    return self;
};

我如何继承我自己的、开明的解析器?这种模式是故意设计的让继承变得尴尬吗?

迄今为止,我唯一成功尝试继承的所有方法binary.parse(<something>)_.extend用作:

var clever_parser = function(buffer) {
    if (this instanceof clever_parser) {
        this.parser = binary.parse(buffer);  // I guess this is super.constructor(...)
        _.extend(this.parser, this);         // Really?
        return this.parser;
    } else {
        return new clever_parser(buffer);
    }
}

这没有通过我的嗅觉测试,以及其他人的嗅觉测试。这有什么让人觉得很危险的吗?

4

1 回答 1

0

怎么样:

var clever_parser = function ( buffer ) {
    var parser = binary.parse( buffer );
    _.extend( parser, clever_parser.methods );
    return parser;
}

clever_parser.methods = {
    foo: function () { ... },
    bar: function () { ... }
};

binary.parse函数返回一个普通对象(继承自 的对象Object.prototype),并且随后无法重定向其原型链接(除非使用__proto__,但这是非标准且已弃用)。

所以,我们唯一能做的就是用我们的方法手动扩展那个对象......

顺便说一句,该clever_parser功能可以作为工厂功能正常工作。您不必为构造函数和new运算符而烦恼。


此外,您可以采取相反的方法:首先,创建继承您的方法的对象,然后使用在binary.parse函数中分配的属性对其进行扩展:

var clever_parser = function ( buffer ) {
    var parser = Object.create( clever_parser.methods );
    _.extend( parser, binary.parse( buffer ) );
    return parser;
}

如果这种方法有效,它肯定比我上面的原始解决方案更好,因为这里生成的对象继承了您的方法(与上面相反,其中每个实例都包含方法作为自己的属性)。

于 2012-06-04T22:53:31.310 回答