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);
}
}
这没有通过我和其他人的嗅觉测试。这有什么让人感到危险的地方吗?
最佳答案
怎么样:
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
的对象),并且随后无法重定向其原型(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;
}
如果这种方法有效,它肯定比我上面的原始解决方案更好,因为这里生成的对象继承了您的方法(与上面相反,其中每个实例都包含方法作为自己的属性)。
关于javascript - 如何继承 "constructor returns another object"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889360/