1

プロトタイプへの 2 つの引数が、期待どおりのインスタンスであるかどうかを検証しようとしています。cleartextStream が node.js ドキュメントでtls.cleartextStreamと呼ばれるもののインスタンスであるかどうか、および manager が別のファイルで自分自身を定義したプロトタイプのインスタンスであるかどうかを知る必要があります。

var tls = require('tls'),
    clientManager = require('./client_manager');

var Client = function (cleartextStream, manager) {
    /*
     * Both arguments must be proper instances of the expected classes.
     */
    if (!(cleartextStream instanceof tls.cleartextStream) || !(manager instanceof clientManager))
        throw (...)

今まではすべて「よかった」。そのビットが実行されると、次のようになります。

if (!(cleartextStream instanceof tls.cleartextStream) || !(manager instanceof
TypeError: Expecting a function in instanceof check, but got #<CleartextStream>

そして、マネージャー部分の場合:

if (!(cleartextStream instanceof tls) || !(manager instanceof clientManager))
TypeError: Expecting a function in instanceof check, but got [object Object]

では、これらのインスタンスを確認するにはどうすればよいでしょうか。

編集:この投稿を読んだ後、オブジェクトは実際にはコンストラクターのインスタンスであるため、コードを次のように変更することがわかりました

if (!(cleartextStream instanceof tls) || !(manager instanceof clientManager.constructor))

実際には2番目の問題を修正します。それでも、最初のものは持続します。

4

1 に答える 1

0

tls はこれらのクラスをエクスポートしてチェックするわけではないので、本当にクリーンな方法はありません。

できることの 1 つは、オブジェクトのプロトタイプが期待どおりかどうかを確認することです。

target_proto = new tls.createSecurePair().cleartext.__proto__
if (target_proto !== clearTextStream.proto)
  throw(....)

注意すべきことの 1 つは、これが機能するのは、あなたとこのオブジェクトの作成者が同じバージョンのモジュールを参照している (たとえば、同じパスでインポートされたなど) 場合のみであり、protoオブジェクトは等しいものとして比較されます。 .

于 2012-08-19T06:22:12.520 に答える