javascript - 如何继承 "constructor returns another object"对象

标签 javascript node.js prototype

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/

相关文章:

c++ - 从 cmake 文件运行 npm 命令

javascript - 自定义方法以及构造函数和原型(prototype)在 web-dev 中的用处

MyClass.prototype = {} 和 MyClass.prototype.method 之间的 Javascript 区别

c++ - QT 框架错误 : prototype for 'QtDownload::QtDownload(MainWindow)' does not match any in class 'QtDownload'

javascript - 在 "CSS3 transient animation"的处理过程中能否得到 transient 值

javascript - 使用 jQuery,如何将 arg 传递给函数,然后显示来自预定义变量的消息

javascript - 如何在 slider 上显示 4 个图像

javascript - 有没有办法用beautiful soup过滤掉JavaScript中嵌入的product id

sql - 如何将现有的 NodeJS 服务器应用程序连接到 Azure SQL 数据库

html - Node Sass 尚不支持您当前的环境 : Windows 64-bit with Unsupported runtime