【问题标题】:Why is "setter is defined without getter" a JSHint error?为什么“setter is defined without getter”是 JSHint 错误?
【发布时间】:2014-06-17 11:08:16
【问题描述】:

参考jsfiddle

var obj = {
  set bla(k) {
    console.log(k);
  }
};

JSHint 将此标记为“setter 是在没有 getter 的情况下定义的”。我确信有办法将其关闭,但为什么这是一个错误呢?我看到的所有 JSHint 标志都有一个合理的解释。我想不出为什么这是一件坏事。

【问题讨论】:

  • 我认为这是一个设计缺陷。只关心副作用的设置器(在你的例子中是 console.log )是非常规的,如果他们真的改变了你希望你能以某种方式读取新值的实例。让它成为一种方法。
  • 这实际上在只写语言 perl 中更常见。
  • 你可以像这样禁用它: set: foo { } // jshint -W078

标签: javascript jshint lint


【解决方案1】:

我认为 JSHint 没有充分的理由警告这种情况。我在规范(http://www.ecma-international.org/publications/standards/Ecma-262.htm,第 30-31 页)中没有看到任何要求如果有 setter 则需要有 getter 的内容,反之亦然,并且很容易想象 setter 并不意味着 getter .例如,您可能希望在 setter 中设置脏标志。没有理由定义 getter。

我在 JSHint 源或它的历史中没有看到任何理由。

【讨论】:

  • 我同意,setter 有很多用例会影响对象的 行为计算 等,而没有任何理由getFoo() 就可以了。如果 getter 和 setter 总是成对的,那么你已经将一个对象简化为一种过程语言struct
  • 没有弄错,因为它没有将其标记Syntax Error,而只是警告“在没有getter的情况下定义了setter "
【解决方案2】:

这很可能因为可疑而被标记。只写属性是一件相当不寻常的事情。你故意这样做的几率比你犯错的几率要低得多。这类似于您在写 foo == null 时发出的警告——这并不违法,甚至必然错,但它更可能是错的而不是正确的。

【讨论】:

    【解决方案3】:

    你也可以有这样的代码,你会得到同样的 JSHint 错误:

    appSession: {
        officername: "Denis Test",
        get getOfficername() {
            return `${this.officername}`;
        },
        set setOfficername(name) {
            this.officername = name;
        }
    };
    

    但是,如果 getter 和 setter 具有以下相同的名称,并且前缀 getset 在它们之前,则错误将消失:

        get Officername() {
            return `${this.officername}`;
        },
        set Officername(name) {
            this.officername = name;
        }
    

    请注意我在两个示例中命名方法的方式不同。对于您的情况,添加一个与您的“设置”方法同名的get 方法,您的错误就会消失。

    var obj = {
        set bla(k) {
            console.log(k);
        }
        get bla(){
            console.log(obj.bla);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多