2013-06-25 39 views
8

在JavaScript中,我喜欢用于构造函数的PascalCase和用于其他函数的camelCase的命名约定。它看起来像ReSharper配置为这些设置。然而,对于这样的代码:对构造函数的JavaScript命名约定的ReSharper警告

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

var thing = new Thing(2, 6); 

...我收到这样的警告:

名称“东西”不不符合规则“本地功能”。建议的名称是'事情'。

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

我怀疑只有“公开”的功能被认为是构造函数:

如果我改变Thing这个它不会有所作为。你们有没有人知道ReSharper如何区分“本地”和“构造函数”功能?更好的是,你知道如何覆盖这种行为吗?

回答

9

恩,这是ReSharper的bug。您可以自己等待或修复它。或者在全球范围内定义它。

顺便说一句,这些功能做了非常非常不同的事情。你绝对不想称之为构造函数。

+0

感谢您找到错误报告。我有一个问题:前一个函数*不是构造函数吗?如果一个函数在用'new'调用时返回一个值,则返回的值将成为创建对象的“this”。另外,用这种方式写下来,无论你是用'new'还是不用''来调用它,你都会得到相同的结果。 – Jacob

+1

@Jacob因为它不构造'Thing'的对象,它返回Object的对象。在JS中,构造函数可以返回任何“类”的实例,并且返回对象文字是特定情况下的特例,它允许人们完全否定构造函数和原型。 – Esailija

+0

有道理。感谢您的解释。 – Jacob

0

,如果你希望你的构造函数是公共的,您可以使用此解决方法:

(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); 

或者,如果你不想ReSharper的来抱怨 “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); 

})(); 
+0

感谢您的提示。我不希望我的构造函数是全局的。我的问题是关于ReSharper抱怨*非公开的构造函数的命名。 – Jacob