0

コードに少し問題があります。メソッドチェーンとコンストラクタチェーンの概念は理解していますが、正しく機能させることができません。これが私がこれまでに持っているものです:

function Set() {
    this.values = [];
}

Set.prototype.add = function() {
    for (i = 0; i < arguments.length; i++) {
        this.values.push(arguments[i]);
    }
}

var regSet = new Set();
regSet.add(10, 11, null);
console.log(regSet.values);  // → [10, 11, null];

function NonNullSet() {
    Set.apply(this, arguments);
}

NonNullSet.prototype = Object.create(Set.prototype);
NonNullSet.prototype.constructor = NonNullSet;

NonNullSet.prototype.add = function () {
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] == null || arguments[i] == undefined) {
            throw new Error("Can't add null or undefined");
        }
    }

    return Set.prototype.add.apply(this, arguments);
}

var nonNull = new NonNullSet();
nonNull.add(10, 12, null);
console.log(nonNull.values);  // → undefined

上記のコードからわかるように、nonNullSetはSetのサブクラスであり、nullまたは未定義の値をチェックすることでaddメソッドを拡張しようとしています。それらが存在する場合は、ループを続行します。それらが有効な値である場合は、書き換えるのではなく、Setスーパークラスのaddメソッドを呼び出します。

私には、これは正しく見え、希望する結果が得られないため、何かが正しくありません。私はここで何が間違っているのですか?

4

1 に答える 1

1

2 つの問題があります。

  • continue次のループ反復にスキップしますが、ループはとにかく何もしないので、ループcontinue内で -ing しても何も変わりません。代わりに、Set.add一度に 1 つの要素を与えて、実際にループ内で呼び出す必要があります — ただし、要素が non- の場合のみですnull
  • console.log(nonNullSet.values)であるべきですconsole.log(nonNull.values)nonNullSetあなたのコンストラクター、nonNullあなたのインスタンスです。

また、正確には問題ではありませんが、改善すべきその他の点:

  • 大文字にする必要がありNonNullSetます。
  • 内部では、キーワードを使用してローカル変数Set.prototype.addを作成する必要があります。ivar
  • 変数名には が含まれていますnullが、null をチェックする代わりに、虚偽をチェックします。(nullもちろん、間違っていますが、他のいくつかのこともそうです。)これは少し混乱していると思います。
于 2012-11-24T01:15:01.537 に答える