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

我看到两个问题:

  • continue跳到下一个循环迭代,但循环无论如何都不做任何事情,所以continue-ing 在它里面不会改变任何东西。相反,您实际上应该Set.add在循环内部调用,一次给它一个元素——但前提是该元素是非 - null
  • console.log(nonNullSet.values)应该是console.log(nonNull.values)nonNullSet是你的构造函数,nonNull是你的实例。

此外,不完全是问题,而是您应该改进的其他方面:

  • 你应该大写NonNullSet
  • 在内部Set.prototype.add,您应该i使用var关键字创建一个局部变量。
  • 您的变量名包含null,但不是检查无效性,而是检查虚假性。(null当然,这是虚假的,但其他一些事情也是如此。)我认为这有点令人困惑。
于 2012-11-24T01:15:01.537 回答