【问题标题】:ReSharper warnings for JavaScript naming convention on constructor functionsReSharper 对构造函数的 JavaScript 命名约定的警告
【发布时间】:2013-06-25 18:10:47
【问题描述】:

在 JavaScript 中,我喜欢 PascalCase 用于构造函数的命名约定和 camelCase 用于其他函数的命名约定。看起来 ReSharper 已针对这些设置进行了配置。但是,对于这样的代码:

function Thing(a, b) {
    return {
        prop1: a,
        prop2: b
    };
}

var thing = new Thing(2, 6);

...我收到此警告:

名称“事物”与规则“本地函数”不匹配。建议的名称是“事物”。

如果我将Thing 更改为以下内容并没有什么不同:

function Thing(a, b) {
    this.prop1 = a;
    this.prop2 = b;
}

我怀疑只有“公共”函数才被认为是构造函数。你们中有人知道 ReSharper 如何区分“本地”和“构造函数”函数吗?更好的是,您知道如何覆盖此行为吗?

【问题讨论】:

    标签: javascript naming-conventions resharper


    【解决方案1】:

    嗯,这是 ReSharper 中的 bug。您可以等待或自行修复。或者在全局范围内定义它。

    顺便说一句,这些函数做了非常非常不同的事情。您绝对不想将前者称为构造函数。

    【讨论】:

    • 感谢您找到错误报告。不过我有一个问题:前一个函数 not 是如何构造函数的?如果函数在使用new 调用时返回一个值,则该返回值将成为创建对象的“this”。另外,以这种方式编写,无论您是否使用new 调用它,您都会得到相同的结果。
    • @Jacob 因为它不构造Thing 的对象,它返回Object 的对象。在 JS 中,构造函数可以返回任何“类”的实例,并且返回对象字面量是一种特殊情况,该特性允许我们完全否定构造函数和原型的点。
    • 有道理。谢谢你的解释。
    • @Jacob:详细说明一下,js 中真正的“构造函数”允许您自定义 .prototype 属性,以便“新”派生对象实例可以继承属性。如果你返回一个字面量或者没有使用 new,那么就没有空白原型可以弄乱了。
    • @Jacob 请在宽限期结束前发放赏金,否则我只能得到 50 分 :P 100 分已经从你身上扣除了,所以你不会失去任何东西。
    【解决方案2】:

    如果你希望你的构造函数是公开的,你可以使用这个解决方法:

    (function(global){
    
        function kindOfPrivateFunction(thing){
           //Do something with thing
        }
    
        global.Thing = function(a, b) {
            this.prop1 = a;
            this.prop2 = b;
    
            knindOfPrivateFunction(this);
        };
    
        global.Thing.publicFunction = function() { };
    
    })(this);
    

    或者,如果您不想让更尖锐的人抱怨“ThisInGlobalContext”:

    (function(){
    
        function kindOfPrivateFunction(thing){
           //Do something with thing
        }
    
        this.Thing = function(a, b) {
            this.prop1 = a;
            this.prop2 = b;
    
            knindOfPrivateFunction(this);
        };
    
        this.Thing.publicFunction = function() { };
    
    })();
    

    编辑

    考虑到您的类必须是本地的,您可以使用本地对象来“存储”本地构造函数。但这实际上只是关闭 Resharper 的一种技巧......

    (function(){
    
        var local = {};
    
        function kindOfPrivateFunction(thing){
           //Do something with thing
        }
    
        local.Thing = function(a, b) {
            this.prop1 = a;
            this.prop2 = b;
    
            knindOfPrivateFunction(this);
        };
    
        local.Thing.prototype.publicFunction = function() { };
    
        var instance = new local.Thing(1, 2);
    
    })();
    

    【讨论】:

    • 感谢您的提示。我不希望我的构造函数是全局的。我的问题是关于 ReSharper 抱怨 公开的构造函数的命名。
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多