1

ノード バイナリバイナリ パーサーは、次のパターンでオブジェクトを構築します。

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 に答える