为什么“setter未定义getter”是JSHint的错误?

7

Reference jsfiddle

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

JSHint将此标记为“setter is defined without getter”。我确定有一种方法可以关闭它,但为什么这是一个错误呢?我看到JSHint标志的所有内容都有合理的解释。我想不出为什么这是一件坏事。


2
我认为这是一个设计缺陷。只关注副作用(在您的情况下是console.log)的setters是不常见的,如果它们实际上改变了实例,您期望能以某种方式读取新值。将其设为方法。 - Bergi
这在Perl中实际上更为常见,因为它是一种只写语言。 - kennebec
2
你可以这样禁用它:set: foo { } // jshint -W078 - Rimian
3个回答

9
我认为JSHint没有充分的理由来警告这种情况。在规范(http://www.ecma-international.org/publications/standards/Ecma-262.htm,第30-31页)中,我没有看到要求如果有setter就必须有getter或反之亦然的内容,而且可以很容易地想象出不需要getter的setter。例如,您可能希望在setter中设置一个“dirty”标志。没有理由定义一个getter。
我没有在JSHint源代码或其历史中看到任何理由。

我同意,有很多情况下,设置器会影响对象的行为计算等,没有理由去getFoo()它。如果getter和setter总是成对出现,那么您已经将对象简化为面向过程语言struct - Stephen P
1
这并不是错误,因为它没有将其标记为“语法错误”,而只是警告“定义了一个setter但没有getter”。 - Bergi

1
你也可以像这样编写代码,然后会得到相同的 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;
    }

请注意我在这两个例子中如何命名我的方法的区别。对于您的情况,请添加一个与您的“set”方法同名的get方法,您的错误将消失。
var obj = {
    set bla(k) {
        console.log(k);
    }
    get bla(){
        console.log(obj.bla);
    }
};

1
这很可能被标记为可疑,因为写入属性是相当不寻常的事情。你故意这样做的可能性要低得多,而犯错的可能性要高得多。这类似于在写 foo == null 时发出警告 - 这不是非法的,甚至不一定是错误的,但是它更有可能是错误的而不是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接