2015-10-07 170 views
0

即使javascript中没有“真实”对象,我仍在努力如何使它们彼此不同。不同的javascript对象具有相同的属性(名称)

例如我有这样限定的两个对象AppleOrange

function Apple(){ 
    this.name = "Apple"; 
} 

function Orange(){ 
    this.name = "Orange"; 
} 

OOP的角度来看,这两个name属性不连接,因为它们是不同类别的属性。

我的问题是,当重命名苹果的class的名称属性时,ReSharper也会要求我重命名Orange类的属性。 同时按下F12(GOTO DEFINITION)将显示两个属性。

但是为什么?它们是否在全球范围内定义?我如何区分它们,使橙色和苹果是真正不同的对象?

+2

这似乎是与ReSharper不与您的代码的问题。这些类的JS对象是完全不同的:http://jsfiddle.net/16owh01o/3/ –

+0

也就是说,除非你正在调用函数而不是通过构造函数:'Orange(); Apple();'在这种情况下,两者都会写入全局范围,因为'this'会引用全局对象(通常是'window')。也许reshaper对你的函数使用做出假设。 – nils

+0

@nils:那么任何我可以尝试不让他们在全球范围内?不知道你的意思是'除非你将函数作为函数调用,而不是通过构造函数' – KingKerosin

回答

0

ReSharper不能提前知道你将如何使用你的函数“Apple”和“Orange”。这就是为什么它会搜索某个符号的所有可能的动态用法。让我们看看下面的例子:

function Apple(){ 
 
    this.name = "Apple"; 
 
} 
 

 
function Orange(){ 
 
    this.name = "Orange"; 
 
} 
 

 
var x = {name: "Tomato" }; 
 

 
Apple.call(x); 
 

 
alert(x.name); 
 

 
Orange.call(x); 
 

 
alert(x.name);

如果重命名为“名”,以不同的东西的项目之一,但让别人名为“名”,你的代码会变得破碎。所以,重命名所有这些是有意义的。

这就是为什么ReSharper在这种情况下列出所有三种用法的原因,根据代码的确切语义决定哪些用户需要重命名以及哪些用户应该离开。

相关问题