コードに少し問題があります。メソッドチェーンとコンストラクタチェーンの概念は理解していますが、正しく機能させることができません。これが私がこれまでに持っているものです:
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メソッドを呼び出します。
私には、これは正しく見え、希望する結果が得られないため、何かが正しくありません。私はここで何が間違っているのですか?