2015-10-07 167 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在這種情況下列出所有三種用法的原因,根據代碼的確切語義決定哪些用戶需要重命名以及哪些用戶應該離開。

相關問題